7474 id : check_version
7575 run : |
7676 VERSION=${{ steps.get_version.outputs.version }}
77- PACKAGE_NAME=$(node -p "require('./package.json').name")
78- CURRENT_VERSION=$(node -p "require('./package.json').version")
77+
78+ # 安全地获取包名和版本信息
79+ if ! PACKAGE_NAME=$(node -p "require('./package.json').name" 2>/dev/null); then
80+ echo "❌ 无法读取 package.json 中的包名"
81+ exit 1
82+ fi
83+
84+ if ! CURRENT_VERSION=$(node -p "require('./package.json').version" 2>/dev/null); then
85+ echo "❌ 无法读取 package.json 中的当前版本"
86+ exit 1
87+ fi
7988
8089 echo "🔍 检查版本信息:"
8190 echo " 目标版本: $VERSION"
@@ -91,27 +100,72 @@ jobs:
91100 fi
92101
93102 # 检查版本是否已在npm上发布
94- if npm view "$PACKAGE_NAME@$VERSION" version 2>/dev/null; then
103+ echo "🔍 检查 npm 上的版本..."
104+ NPM_VERSION_OUTPUT=$(npm view "$PACKAGE_NAME@$VERSION" version 2>/dev/null || echo "NOT_FOUND")
105+ if [ "$NPM_VERSION_OUTPUT" != "NOT_FOUND" ] && [ -n "$NPM_VERSION_OUTPUT" ]; then
95106 echo "❌ 版本 $VERSION 已存在于 npm 上"
107+ echo "已发布的版本: $NPM_VERSION_OUTPUT"
96108 echo "请使用新的版本号重新发布"
97109 exit 1
98110 fi
111+ echo "✅ 版本 $VERSION 在 npm 上不存在,可以发布"
99112
100113 # 检查标签是否已存在
114+ echo "🔍 检查 git 标签..."
101115 if git tag -l | grep -q "^v$VERSION$"; then
102116 echo "❌ 标签 v$VERSION 已存在"
103117 echo "请使用新的版本号或删除已存在的标签"
104118 exit 1
105119 fi
120+ echo "✅ 标签 v$VERSION 不存在,可以创建"
106121
107- # 对于手动触发,检查版本是否大于当前版本
122+ # 对于手动触发,检查版本关系
108123 if [ "${{ steps.get_version.outputs.is_manual }}" = "true" ]; then
124+ echo "🔍 检查版本关系..."
109125 if [ "$VERSION" = "$CURRENT_VERSION" ]; then
110126 echo "❌ 新版本号不能与当前版本相同"
111127 echo "当前版本: $CURRENT_VERSION"
112128 echo "请使用更高的版本号"
113129 exit 1
114130 fi
131+
132+ # 使用 node 进行语义化版本比较
133+ VERSION_COMPARE=$(node -e "
134+ const semver = require('module').createRequire(import.meta.url)('./package.json').version;
135+ const target = '$VERSION';
136+ const current = '$CURRENT_VERSION';
137+
138+ function parseVersion(v) {
139+ const [main, pre] = v.split('-');
140+ const [major, minor, patch] = main.split('.').map(Number);
141+ return { major, minor, patch, pre: pre || null };
142+ }
143+
144+ function compareVersions(a, b) {
145+ const va = parseVersion(a);
146+ const vb = parseVersion(b);
147+
148+ if (va.major !== vb.major) return va.major - vb.major;
149+ if (va.minor !== vb.minor) return va.minor - vb.minor;
150+ if (va.patch !== vb.patch) return va.patch - vb.patch;
151+
152+ if (va.pre === null && vb.pre === null) return 0;
153+ if (va.pre === null) return 1;
154+ if (vb.pre === null) return -1;
155+ return va.pre.localeCompare(vb.pre);
156+ }
157+
158+ console.log(compareVersions(target, current));
159+ " 2>/dev/null || echo "0")
160+
161+ if [ "$VERSION_COMPARE" -le "0" ]; then
162+ echo "❌ 新版本号必须大于当前版本"
163+ echo "当前版本: $CURRENT_VERSION"
164+ echo "目标版本: $VERSION"
165+ echo "请使用更高的版本号"
166+ exit 1
167+ fi
168+ echo "✅ 版本号检查通过: $VERSION > $CURRENT_VERSION"
115169 fi
116170
117171 echo "✅ 版本 $VERSION 可以发布"
0 commit comments