@@ -29,6 +29,17 @@ GREEN='\033[0;32m'
2929YELLOW=' \033[1;33m'
3030NC=' \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
3344show_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)
5671Arguments:
5772 API_TOKEN API token for crates.io (optional, can also be set via CARGO_REGISTRY_TOKEN environment variable)
5873Examples:
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:
6885DRY_RUN=false
6986AUTO_CONFIRM=false
7087REGISTRY=" "
88+ EXCLUDED_PACKAGES=()
7189
7290# 解析命令行参数 | Parse command line arguments
7391while [[ $# -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
194216fi
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
197234recho \
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
203262if [ " $DRY_RUN " = false ]; then
@@ -233,22 +292,35 @@ declare -A dependencies
233292
234293# 解析依赖关系 | Parse dependencies
235294while 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 "
241313done <<< " $members"
242314
243315# 使用 Kahn 算法进行拓扑排序 | Use Kahn's algorithm for topological sorting
244316# 初始化入度数组 | Initialize the in-degree array
245317declare -A in_degree
246- for member in $members ; do
318+ for member in $filtered_members ; do
247319 in_degree[" $member " ]=0
248320done
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
259331
260332# 初始化队列 | Initialize the queue
261333queue=()
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
290362done
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