Skip to content

Commit abacd68

Browse files
committed
exclude release coro-cli to crate.io
1 parent 03053f1 commit abacd68

2 files changed

Lines changed: 81 additions & 8 deletions

File tree

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ jobs:
7171
- name: Publish project
7272
if: steps.version-check.outputs.version != '0'
7373
run: |
74-
./scripts/publish-crates-io.bash -n ${{ secrets.CRATES_IO_TOKEN }} # Dry run check
75-
./scripts/publish-crates-io.bash -y ${{ secrets.CRATES_IO_TOKEN }} # Actual publish with auto-confirm
74+
./scripts/publish-crates-io.bash -n -e coro-cli ${{ secrets.CRATES_IO_TOKEN }} # Dry run check, exclude coro-cli
75+
./scripts/publish-crates-io.bash -y -e coro-cli ${{ secrets.CRATES_IO_TOKEN }} # Actual publish with auto-confirm, exclude coro-cli
7676
shell: bash
7777

7878
# - name: Setup Pages

scripts/publish-crates-io.bash

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ GREEN='\033[0;32m'
2929
YELLOW='\033[1;33m'
3030
NC='\033[0m' # No Color
3131

32+
# 检查包是否在排除列表中 | Check if package is in exclude list
33+
is_package_excluded() {
34+
local package_name="$1"
35+
for excluded in "${EXCLUDED_PACKAGES[@]}"; do
36+
if [[ "$package_name" == "$excluded" ]]; then
37+
return 0 # Package is excluded
38+
fi
39+
done
40+
return 1 # Package is not excluded
41+
}
42+
3243
# 显示帮助信息 | Show help message
3344
show_help() {
3445
recho \
@@ -38,13 +49,16 @@ show_help() {
3849
-n, --dry-run 只进行预检,不实际发布
3950
-y, --yes 自动确认发布,无需交互
4051
-r, --registry 指定要发布的注册表(例如:crates-io)
52+
-e, --exclude 排除指定的包,不进行发布(可多次使用)
4153
参数:
4254
API_TOKEN crates.io 的 API 令牌(可选,也可以通过 CARGO_REGISTRY_TOKEN 环境变量设置)
4355
示例:
4456
$0 # 使用已保存的令牌或环境变量
4557
$0 -n # 预检模式
4658
$0 -y # 自动确认发布
4759
$0 -r crates-io # 指定注册表
60+
$0 -e coro-cli # 排除 coro-cli 包
61+
$0 -e coro-cli -e other-package # 排除多个包
4862
$0 YOUR_API_TOKEN # 使用指定的 API 令牌
4963
CARGO_REGISTRY_TOKEN=YOUR_API_TOKEN $0 # 通过环境变量设置令牌" \
5064
"Usage: $0 [options] [API_TOKEN]
@@ -53,13 +67,16 @@ Options:
5367
-n, --dry-run Dry run mode, only performs checks without publishing
5468
-y, --yes Automatically confirm publication without interaction
5569
-r, --registry Specify the registry to publish to (e.g., crates-io)
70+
-e, --exclude Exclude specified package from publishing (can be used multiple times)
5671
Arguments:
5772
API_TOKEN API token for crates.io (optional, can also be set via CARGO_REGISTRY_TOKEN environment variable)
5873
Examples:
5974
$0 # Use saved token or environment variable
6075
$0 -n # Dry run mode
6176
$0 -y # Automatically confirm publication
6277
$0 -r crates-io # Specify registry
78+
$0 -e coro-cli # Exclude coro-cli package
79+
$0 -e coro-cli -e other-package # Exclude multiple packages
6380
$0 YOUR_API_TOKEN # Use specified API token
6481
CARGO_REGISTRY_TOKEN=YOUR_API_TOKEN $0 # Set token via environment variable"
6582
}
@@ -68,6 +85,7 @@ Examples:
6885
DRY_RUN=false
6986
AUTO_CONFIRM=false
7087
REGISTRY=""
88+
EXCLUDED_PACKAGES=()
7189

7290
# 解析命令行参数 | Parse command line arguments
7391
while [[ $# -gt 0 ]]; do
@@ -88,6 +106,10 @@ while [[ $# -gt 0 ]]; do
88106
REGISTRY="$2"
89107
shift 2
90108
;;
109+
-e|--exclude)
110+
EXCLUDED_PACKAGES+=("$2")
111+
shift 2
112+
;;
91113
-*)
92114
recho \
93115
"${RED}错误: 未知选项 $1${NC}" \
@@ -193,11 +215,48 @@ if [ -z "$members" ]; then
193215
exit 1
194216
fi
195217

218+
# 过滤排除的包 | Filter excluded packages
219+
filtered_members=""
220+
excluded_members=""
221+
while IFS= read -r member; do
222+
if is_package_excluded "$member"; then
223+
excluded_members="$excluded_members$member\n"
224+
else
225+
filtered_members="$filtered_members$member\n"
226+
fi
227+
done <<< "$members"
228+
229+
# 移除末尾的换行符 | Remove trailing newlines
230+
filtered_members=$(echo -e "$filtered_members" | sed '/^$/d')
231+
excluded_members=$(echo -e "$excluded_members" | sed '/^$/d')
232+
196233
# 显示要发布的包 | Show packages to be published
197234
recho \
198235
"${YELLOW}要发布的包:${NC}" \
199236
"${YELLOW}Packages to be published:${NC}"
200-
echo "$members"
237+
if [ -n "$filtered_members" ]; then
238+
echo "$filtered_members"
239+
else
240+
recho \
241+
"${YELLOW}没有包需要发布(所有包都被排除)${NC}" \
242+
"${YELLOW}No packages to publish (all packages excluded)${NC}"
243+
fi
244+
245+
# 显示排除的包 | Show excluded packages
246+
if [ -n "$excluded_members" ]; then
247+
recho \
248+
"${YELLOW}排除的包:${NC}" \
249+
"${YELLOW}Excluded packages:${NC}"
250+
echo "$excluded_members"
251+
fi
252+
253+
# 检查是否有包需要发布 | Check if there are packages to publish
254+
if [ -z "$filtered_members" ]; then
255+
recho \
256+
"${YELLOW}没有包需要发布,退出。${NC}" \
257+
"${YELLOW}No packages to publish, exiting.${NC}"
258+
exit 0
259+
fi
201260

202261
# 确认发布 | Confirm publication
203262
if [ "$DRY_RUN" = false ]; then
@@ -233,22 +292,35 @@ declare -A dependencies
233292

234293
# 解析依赖关系 | Parse dependencies
235294
while IFS= read -r member; do
295+
# 跳过排除的包 | Skip excluded packages
296+
if is_package_excluded "$member"; then
297+
continue
298+
fi
299+
236300
# 获取直接依赖 | Get direct dependencies
237301
deps=$(echo "$metadata" | jq -r --arg name "$member" '.packages[] | select(.name == $name) | .dependencies[] | select(.name | startswith("coro-")) | .name')
238302

303+
# 过滤掉排除的依赖 | Filter out excluded dependencies
304+
filtered_deps=""
305+
for dep in $deps; do
306+
if ! is_package_excluded "$dep"; then
307+
filtered_deps="$filtered_deps$dep "
308+
fi
309+
done
310+
239311
# 将依赖关系存储在数组中
240-
dependencies["$member"]="$deps"
312+
dependencies["$member"]="$filtered_deps"
241313
done <<< "$members"
242314

243315
# 使用 Kahn 算法进行拓扑排序 | Use Kahn's algorithm for topological sorting
244316
# 初始化入度数组 | Initialize the in-degree array
245317
declare -A in_degree
246-
for member in $members; do
318+
for member in $filtered_members; do
247319
in_degree["$member"]=0
248320
done
249321

250322
# 计算每个节点的入度 | Calculate the in-degree of each node
251-
for member in $members; do
323+
for member in $filtered_members; do
252324
deps=${dependencies["$member"]}
253325
for dep in $deps; do
254326
if [[ -n "${in_degree[$dep]}" ]]; then
@@ -259,7 +331,7 @@ done
259331

260332
# 初始化队列 | Initialize the queue
261333
queue=()
262-
for member in $members; do
334+
for member in $filtered_members; do
263335
if [[ ${in_degree["$member"]} -eq 0 ]]; then
264336
queue+=("$member")
265337
fi
@@ -290,7 +362,8 @@ while [[ ${#queue[@]} -gt 0 ]]; do
290362
done
291363

292364
# 检查是否存在循环依赖 | Check for circular dependencies
293-
if [[ ${#publish_order[@]} -ne $(echo "$members" | wc -w) ]]; then
365+
filtered_members_count=$(echo "$filtered_members" | wc -w)
366+
if [[ ${#publish_order[@]} -ne $filtered_members_count ]]; then
294367
recho \
295368
"${RED}错误: 无法确定发布顺序,请检查包之间的依赖关系是否存在循环。${NC}" \
296369
"${RED}Error: Could not determine publish order, please check for circular dependencies between packages.${NC}"

0 commit comments

Comments
 (0)