Skip to content

Commit e51353a

Browse files
committed
fix: 为所有 GitHub Actions 工作流添加 pnpm 支持
- 修复 build.yml、test.yml、release.yml、dependencies.yml、quality.yml - 添加包管理器自动检测逻辑(pnpm > yarn > npm) - 使用 pnpm/action-setup@v4 安装 pnpm - 更新所有 npm 命令为动态包管理器命令 - 修复缓存配置以支持 pnpm
1 parent 715e7fa commit e51353a

5 files changed

Lines changed: 461 additions & 68 deletions

File tree

‎.github/workflows/build.yml‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,27 @@ jobs:
3838
- name: Detect package manager
3939
id: detect-package-manager
4040
run: |
41-
if [ -f "${{ github.workspace }}/yarn.lock" ]; then
41+
if [ -f "${{ github.workspace }}/pnpm-lock.yaml" ]; then
42+
echo "manager=pnpm" >> $GITHUB_OUTPUT
43+
echo "command=install --frozen-lockfile" >> $GITHUB_OUTPUT
44+
exit 0
45+
elif [ -f "${{ github.workspace }}/yarn.lock" ]; then
4246
echo "manager=yarn" >> $GITHUB_OUTPUT
4347
echo "command=install" >> $GITHUB_OUTPUT
4448
exit 0
45-
elif [ -f "${{ github.workspace }}/package.json" ]; then
49+
elif [ -f "${{ github.workspace }}/package-lock.json" ]; then
4650
echo "manager=npm" >> $GITHUB_OUTPUT
4751
echo "command=ci" >> $GITHUB_OUTPUT
4852
exit 0
4953
else
5054
echo "Unable to determine package manager"
5155
exit 1
5256
fi
57+
- name: Setup pnpm
58+
if: steps.detect-package-manager.outputs.manager == 'pnpm'
59+
uses: pnpm/action-setup@v4
60+
with:
61+
version: 10.19.0
5362
- name: Setup Node
5463
uses: actions/setup-node@v4
5564
with:

‎.github/workflows/dependencies.yml‎

Lines changed: 90 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,46 @@ jobs:
2929
- name: 📥 Checkout code
3030
uses: actions/checkout@v4
3131

32+
- name: Detect package manager
33+
id: detect-package-manager
34+
run: |
35+
if [ -f "${{ github.workspace }}/pnpm-lock.yaml" ]; then
36+
echo "manager=pnpm" >> $GITHUB_OUTPUT
37+
echo "command=install --frozen-lockfile" >> $GITHUB_OUTPUT
38+
exit 0
39+
elif [ -f "${{ github.workspace }}/yarn.lock" ]; then
40+
echo "manager=yarn" >> $GITHUB_OUTPUT
41+
echo "command=install" >> $GITHUB_OUTPUT
42+
exit 0
43+
elif [ -f "${{ github.workspace }}/package-lock.json" ]; then
44+
echo "manager=npm" >> $GITHUB_OUTPUT
45+
echo "command=ci" >> $GITHUB_OUTPUT
46+
exit 0
47+
else
48+
echo "Unable to determine package manager"
49+
exit 1
50+
fi
51+
- name: Setup pnpm
52+
if: steps.detect-package-manager.outputs.manager == 'pnpm'
53+
uses: pnpm/action-setup@v4
54+
with:
55+
version: 10.19.0
3256
- name: 📦 Setup Node.js
3357
uses: actions/setup-node@v4
3458
with:
3559
node-version: "22"
36-
cache: "npm"
60+
cache: ${{ steps.detect-package-manager.outputs.manager }}
3761

3862
- name: 📥 Install dependencies
39-
run: npm ci
63+
run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
4064

4165
- name: 🔒 Run security audit
4266
run: |
4367
echo "## 🔒 Security Audit Report" >> $GITHUB_STEP_SUMMARY
4468
echo "" >> $GITHUB_STEP_SUMMARY
4569
4670
# 运行安全审计
47-
if npm audit --json > audit-report.json 2>/dev/null; then
71+
if ${{ steps.detect-package-manager.outputs.manager }} audit --json > audit-report.json 2>/dev/null; then
4872
# 解析审计结果
4973
vulnerabilities=$(node -e "
5074
const audit = require('./audit-report.json');
@@ -74,7 +98,7 @@ jobs:
7498
echo "" >> $GITHUB_STEP_SUMMARY
7599
echo "⚠️ **Action Required**: $total_vulns security vulnerabilities found!" >> $GITHUB_STEP_SUMMARY
76100
echo "" >> $GITHUB_STEP_SUMMARY
77-
echo "Run \`npm audit fix\` to automatically fix vulnerabilities." >> $GITHUB_STEP_SUMMARY
101+
echo "Run \`${{ steps.detect-package-manager.outputs.manager }} audit fix\` to automatically fix vulnerabilities." >> $GITHUB_STEP_SUMMARY
78102
79103
# 如果有高危或严重漏洞,创建 issue
80104
critical=$(echo $vulnerabilities | jq -r '.critical')
@@ -151,14 +175,38 @@ jobs:
151175
- name: 📥 Checkout code
152176
uses: actions/checkout@v4
153177

178+
- name: Detect package manager
179+
id: detect-package-manager
180+
run: |
181+
if [ -f "${{ github.workspace }}/pnpm-lock.yaml" ]; then
182+
echo "manager=pnpm" >> $GITHUB_OUTPUT
183+
echo "command=install --frozen-lockfile" >> $GITHUB_OUTPUT
184+
exit 0
185+
elif [ -f "${{ github.workspace }}/yarn.lock" ]; then
186+
echo "manager=yarn" >> $GITHUB_OUTPUT
187+
echo "command=install" >> $GITHUB_OUTPUT
188+
exit 0
189+
elif [ -f "${{ github.workspace }}/package-lock.json" ]; then
190+
echo "manager=npm" >> $GITHUB_OUTPUT
191+
echo "command=ci" >> $GITHUB_OUTPUT
192+
exit 0
193+
else
194+
echo "Unable to determine package manager"
195+
exit 1
196+
fi
197+
- name: Setup pnpm
198+
if: steps.detect-package-manager.outputs.manager == 'pnpm'
199+
uses: pnpm/action-setup@v4
200+
with:
201+
version: 10.19.0
154202
- name: 📦 Setup Node.js
155203
uses: actions/setup-node@v4
156204
with:
157205
node-version: "22"
158-
cache: "npm"
206+
cache: ${{ steps.detect-package-manager.outputs.manager }}
159207

160208
- name: 📥 Install dependencies
161-
run: npm ci
209+
run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
162210

163211
- name: 📋 Check for outdated packages
164212
id: check
@@ -167,7 +215,7 @@ jobs:
167215
echo "" >> $GITHUB_STEP_SUMMARY
168216
169217
# 检查过期的包
170-
if npm outdated --json > outdated.json 2>/dev/null; then
218+
if ${{ steps.detect-package-manager.outputs.manager }} outdated --json > outdated.json 2>/dev/null; then
171219
if [ -s outdated.json ]; then
172220
echo "has-updates=true" >> $GITHUB_OUTPUT
173221
@@ -246,22 +294,22 @@ jobs:
246294
case $update_type in
247295
"patch")
248296
echo "Updating patch versions..." >> $GITHUB_STEP_SUMMARY
249-
npm update --save
297+
${{ steps.detect-package-manager.outputs.manager }} update
250298
;;
251299
"minor")
252300
echo "Updating minor versions..." >> $GITHUB_STEP_SUMMARY
253301
npx npm-check-updates -u --target minor
254-
npm install
302+
${{ steps.detect-package-manager.outputs.manager }} install
255303
;;
256304
"major")
257305
echo "Updating major versions..." >> $GITHUB_STEP_SUMMARY
258306
npx npm-check-updates -u --target major
259-
npm install
307+
${{ steps.detect-package-manager.outputs.manager }} install
260308
;;
261309
"all")
262310
echo "Updating all versions..." >> $GITHUB_STEP_SUMMARY
263311
npx npm-check-updates -u
264-
npm install
312+
${{ steps.detect-package-manager.outputs.manager }} install
265313
;;
266314
esac
267315
@@ -271,7 +319,7 @@ jobs:
271319
echo "" >> $GITHUB_STEP_SUMMARY
272320
273321
# 安装测试依赖
274-
npm install --save-dev vitest jsdom @vitest/ui c8
322+
${{ steps.detect-package-manager.outputs.manager }} add -D vitest jsdom @vitest/ui c8
275323
276324
# 运行测试
277325
if npx vitest run tests/utils/config-helpers*.test.ts --reporter=verbose; then
@@ -297,7 +345,7 @@ jobs:
297345
done
298346
299347
# 检查 package.json 的变更
300-
if git diff --name-only | grep -q "package.json\|package-lock.json"; then
348+
if git diff --name-only | grep -q "package.json\|pnpm-lock.yaml\|package-lock.json\|yarn.lock"; then
301349
echo "" >> $GITHUB_STEP_SUMMARY
302350
echo "### Package Changes:" >> $GITHUB_STEP_SUMMARY
303351
echo "\`\`\`diff" >> $GITHUB_STEP_SUMMARY
@@ -393,23 +441,47 @@ jobs:
393441
- name: 📥 Checkout code
394442
uses: actions/checkout@v4
395443

444+
- name: Detect package manager
445+
id: detect-package-manager
446+
run: |
447+
if [ -f "${{ github.workspace }}/pnpm-lock.yaml" ]; then
448+
echo "manager=pnpm" >> $GITHUB_OUTPUT
449+
echo "command=install --frozen-lockfile" >> $GITHUB_OUTPUT
450+
exit 0
451+
elif [ -f "${{ github.workspace }}/yarn.lock" ]; then
452+
echo "manager=yarn" >> $GITHUB_OUTPUT
453+
echo "command=install" >> $GITHUB_OUTPUT
454+
exit 0
455+
elif [ -f "${{ github.workspace }}/package-lock.json" ]; then
456+
echo "manager=npm" >> $GITHUB_OUTPUT
457+
echo "command=ci" >> $GITHUB_OUTPUT
458+
exit 0
459+
else
460+
echo "Unable to determine package manager"
461+
exit 1
462+
fi
463+
- name: Setup pnpm
464+
if: steps.detect-package-manager.outputs.manager == 'pnpm'
465+
uses: pnpm/action-setup@v4
466+
with:
467+
version: 10.19.0
396468
- name: 📦 Setup Node.js
397469
uses: actions/setup-node@v4
398470
with:
399471
node-version: "22"
400-
cache: "npm"
472+
cache: ${{ steps.detect-package-manager.outputs.manager }}
401473

402474
- name: 📥 Install dependencies
403-
run: npm ci
475+
run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }}
404476

405477
- name: 📊 Generate dependency report
406478
run: |
407479
echo "# 📊 Dependency Analysis Report" >> $GITHUB_STEP_SUMMARY
408480
echo "" >> $GITHUB_STEP_SUMMARY
409481
410482
# 依赖统计
411-
total_deps=$(npm list --depth=0 --json | jq '.dependencies | length')
412-
dev_deps=$(npm list --depth=0 --dev --json | jq '.dependencies | length // 0')
483+
total_deps=$(${{ steps.detect-package-manager.outputs.manager }} list --depth=0 --json | jq '.dependencies | length')
484+
dev_deps=$(${{ steps.detect-package-manager.outputs.manager }} list --depth=0 --dev --json | jq '.dependencies | length // 0')
413485
prod_deps=$((total_deps - dev_deps))
414486
415487
echo "## 📈 Dependency Statistics" >> $GITHUB_STEP_SUMMARY
@@ -445,5 +517,5 @@ jobs:
445517
name: dependency-analysis-report
446518
path: |
447519
package.json
448-
package-lock.json
520+
pnpm-lock.yaml
449521
retention-days: 30

0 commit comments

Comments
 (0)