Skip to content

Commit a7eed8d

Browse files
authored
Merge pull request #237 from InvolutionHell/copilot/investigate-pnpm-lock-quote-issue
2 parents 619d571 + b2987dd commit a7eed8d

File tree

11 files changed

+619
-13
lines changed

11 files changed

+619
-13
lines changed

.github/workflows/content-check.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,42 @@ jobs:
3131
steps:
3232
- uses: actions/checkout@v4
3333

34+
# Enable corepack to ensure the exact pnpm version from package.json is used
35+
- name: Enable Corepack
36+
run: corepack enable
37+
3438
- uses: pnpm/action-setup@v4
3539

3640
- uses: actions/setup-node@v4
3741
with:
3842
node-version: 20
3943
cache: "pnpm"
4044

45+
# Verify pnpm version matches package.json packageManager field
46+
- name: Check pnpm version
47+
run: node scripts/check-pnpm-version.mjs
48+
4149
- run: pnpm install --frozen-lockfile
50+
51+
# Verify lockfile wasn't modified by install
52+
- name: Check lockfile consistency
53+
run: |
54+
if ! git diff --exit-code pnpm-lock.yaml; then
55+
echo "❌ Error: pnpm-lock.yaml was modified after install"
56+
echo "This indicates a pnpm version mismatch or corrupted lockfile"
57+
echo ""
58+
echo "Expected pnpm version from package.json:"
59+
# Use multiple fallback methods to extract version
60+
grep '"packageManager"' package.json | grep -o 'pnpm@[^"]*' || \
61+
node -e "try { console.log(require('./package.json').packageManager || 'not specified') } catch(e) { console.log('Could not read') }" || \
62+
echo "Could not extract version"
63+
echo ""
64+
echo "Actual pnpm version:"
65+
pnpm --version || echo "pnpm not found"
66+
exit 1
67+
fi
68+
echo "✅ Lockfile is consistent"
69+
4270
- name: Run tests
4371
run: pnpm test
4472
# Non-blocking image migration + lint (visibility only)

.github/workflows/deploy.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,41 @@ jobs:
2020
steps:
2121
- uses: actions/checkout@v4
2222

23+
# Enable corepack to ensure the exact pnpm version from package.json is used
24+
- name: Enable Corepack
25+
run: corepack enable
26+
2327
- uses: pnpm/action-setup@v4
2428

2529
- uses: actions/setup-node@v4
2630
with:
2731
node-version: 20
2832
cache: pnpm
2933

34+
# Verify pnpm version matches package.json packageManager field
35+
- name: Check pnpm version
36+
run: node scripts/check-pnpm-version.mjs
37+
3038
- run: pnpm install --frozen-lockfile
39+
40+
# Verify lockfile wasn't modified by install
41+
- name: Check lockfile consistency
42+
run: |
43+
if ! git diff --exit-code pnpm-lock.yaml; then
44+
echo "❌ Error: pnpm-lock.yaml was modified after install"
45+
echo "This indicates a pnpm version mismatch or corrupted lockfile"
46+
echo ""
47+
echo "Expected pnpm version from package.json:"
48+
# Use multiple fallback methods to extract version
49+
grep '"packageManager"' package.json | grep -o 'pnpm@[^"]*' || \
50+
node -e "try { console.log(require('./package.json').packageManager || 'not specified') } catch(e) { console.log('Could not read') }" || \
51+
echo "Could not extract version"
52+
echo ""
53+
echo "Actual pnpm version:"
54+
pnpm --version || echo "pnpm not found"
55+
exit 1
56+
fi
57+
echo "✅ Lockfile is consistent"
3158
- run: pnpm run lint
3259
- run: pnpm run lint:images
3360
- run: pnpm run typecheck

.github/workflows/sync-uuid.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,21 @@ jobs:
3636
steps:
3737
- uses: actions/checkout@v4
3838

39+
# Enable corepack to ensure the exact pnpm version from package.json is used
40+
- name: Enable Corepack
41+
run: corepack enable
42+
3943
- uses: pnpm/action-setup@v4
4044

4145
- uses: actions/setup-node@v4
4246
with:
4347
node-version: 20
4448
cache: "pnpm" # 顺便启用 pnpm 缓存,加速
4549

50+
# Verify pnpm version matches package.json packageManager field
51+
- name: Check pnpm version
52+
run: node scripts/check-pnpm-version.mjs
53+
4654
- name: Install deps
4755
run: pnpm install --frozen-lockfile
4856

.husky/pre-commit

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,9 @@ pnpm lint:images || exit 1
1010
# 3) 运行 Vitest,确保配置校验通过
1111
pnpm test || exit 1
1212

13-
# 4) 其余按 lint-staged 处理(如 Prettier)
13+
# 4) 检查 pnpm 版本和 lockfile 一致性(警告但不阻止提交)
14+
pnpm check:pnpm-version || true
15+
pnpm check:lockfile || true
16+
17+
# 5) 其余按 lint-staged 处理(如 Prettier)
1418
pnpm exec lint-staged

CONTRIBUTING.md

Lines changed: 133 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,83 @@ git push origin doc_raven
173173
| `disable` | 在任何模式下都跳过远程图片尺寸请求,仅使用文档内手动声明的宽高 |
174174
| `force` | 强制启用远程图片尺寸请求,并在出现错误时抛出异常以暴露问题 |
175175

176+
### pnpm 版本和 lockfile 相关问题
177+
178+
#### 问题:pnpm-lock.yaml 频繁出现格式变化(单双引号切换)
179+
180+
**原因**:不同版本的 pnpm 使用不同的 YAML 序列化格式,即使依赖关系相同,锁文件的格式也可能不同。
181+
182+
**解决方案**
183+
184+
1. **确保使用正确的 pnpm 版本**
185+
```bash
186+
# 检查当前版本
187+
pnpm --version
188+
189+
# 应该显示: 10.20.0
190+
# 如果不是,请使用以下命令之一:
191+
192+
# 方法 1: 使用 corepack(推荐)
193+
corepack enable
194+
corepack prepare pnpm@10.20.0 --activate
195+
196+
# 方法 2: 全局安装
197+
npm install -g pnpm@10.20.0
198+
```
199+
200+
2. **验证版本一致性**
201+
```bash
202+
pnpm check:pnpm-version
203+
```
204+
205+
3. **如果 lockfile 已经被错误修改**
206+
```bash
207+
# 丢弃 lockfile 的修改
208+
git checkout pnpm-lock.yaml
209+
210+
# 确认使用正确的 pnpm 版本后重新安装
211+
pnpm install
212+
```
213+
214+
4. **在提交前检查**
215+
项目的 pre-commit hook 会自动检查 pnpm 版本和 lockfile 变更,如果发现版本不匹配会给出警告。
216+
217+
#### 问题:CI 检查失败,提示 lockfile 不一致
218+
219+
这通常意味着:
220+
1. 你本地使用的 pnpm 版本与项目要求的不一致
221+
2. lockfile 被错误修改或损坏
222+
223+
**解决方案**
224+
```bash
225+
# 1. 确认并切换到正确的 pnpm 版本
226+
corepack enable
227+
pnpm --version # 确认是 10.20.0
228+
229+
# 2. 删除 node_modules 和重新安装
230+
rm -rf node_modules
231+
pnpm install
232+
233+
# 3. 检查 lockfile 是否有变更
234+
git status
235+
236+
# 4. 如果没有变更,说明已修复;如果有变更,说明之前的 lockfile 确实有问题
237+
```
238+
239+
#### 问题:为什么要使用 corepack 而不是全局安装?
240+
241+
**Corepack 的优势**
242+
- 自动读取 `package.json``packageManager` 字段
243+
- 每个项目可以使用不同的 pnpm 版本而不冲突
244+
- 新贡献者克隆项目后自动使用正确的版本
245+
- 减少版本不匹配导致的问题
246+
247+
**如何为团队启用 corepack**
248+
```bash
249+
# 一次性设置,之后所有项目都会受益
250+
corepack enable
251+
```
252+
176253
## 🚀 开发环境
177254

178255
### 1. 克隆仓库
@@ -184,10 +261,57 @@ cd involutionhell
184261

185262
### 2. 安装依赖
186263

264+
**重要:为了避免 pnpm-lock.yaml 格式不一致的问题,请务必使用项目指定的 pnpm 版本!**
265+
266+
本项目已在 `package.json` 中锁定了 pnpm 版本(`"packageManager": "pnpm@10.20.0"`),推荐使用 **corepack** 来自动管理正确的版本:
267+
268+
#### 方式一:使用 Corepack(推荐)
269+
270+
Corepack 是 Node.js 16.9+ 自带的工具,能自动使用 `package.json` 中指定的包管理器版本。
271+
272+
```bash
273+
# 启用 corepack
274+
corepack enable
275+
276+
# 安装依赖(corepack 会自动使用 pnpm@10.20.0)
277+
pnpm install
278+
```
279+
280+
#### 方式二:全局安装指定版本
281+
282+
如果不想使用 corepack,可以手动安装项目指定的 pnpm 版本:
283+
284+
```bash
285+
# 安装 pnpm 10.20.0
286+
npm install -g pnpm@10.20.0
287+
288+
# 安装依赖
289+
pnpm install
290+
```
291+
292+
#### 验证 pnpm 版本
293+
294+
安装完成后,请务必验证你使用的是正确的版本:
295+
187296
```bash
188-
pnpm install # 推荐;如需可改用 npm install
297+
# 检查 pnpm 版本
298+
pnpm --version
299+
# 应该输出: 10.20.0
300+
301+
# 或使用项目提供的检查脚本
302+
pnpm check:pnpm-version
189303
```
190304

305+
#### ⚠️ 为什么版本一致性很重要?
306+
307+
不同版本的 pnpm 在序列化 `pnpm-lock.yaml` 时可能使用不同的格式(如单引号 vs 双引号),导致:
308+
- PR 中产生大量无意义的 diff
309+
- 增加代码审查负担
310+
- 可能导致 CI 检查失败
311+
312+
我们的 CI 工作流会自动检查版本一致性,如果检测到版本不匹配会导致构建失败。
313+
314+
191315
### 3. 本地开发
192316

193317
运行开发服务器:
@@ -207,12 +331,14 @@ pnpm dev
207331
常用脚本集中在 `package.json` 中,以下是最常用的命令:
208332

209333
```bash
210-
pnpm dev # 启动开发服务器
211-
pnpm build # 构建生产版本
212-
pnpm start # 启动生产服务器
213-
pnpm lint:images # 检查图片是否符合规范
214-
pnpm migrate:images # 自动迁移图片到对应 assets 目录
215-
pnpm postinstall # 同步必要的 Husky/Fumadocs 配置
334+
pnpm dev # 启动开发服务器
335+
pnpm build # 构建生产版本
336+
pnpm start # 启动生产服务器
337+
pnpm lint:images # 检查图片是否符合规范
338+
pnpm migrate:images # 自动迁移图片到对应 assets 目录
339+
pnpm check:pnpm-version # 检查 pnpm 版本是否与 package.json 一致
340+
pnpm check:lockfile # 检查 lockfile 是否有未预期的修改
341+
pnpm postinstall # 同步必要的 Husky/Fumadocs 配置
216342
```
217343

218344
---

0 commit comments

Comments
 (0)