← 염승준
2026.01

pnpm 오픈소스 기여 — PR #10430

"이 변경은 효과가 없다"는 피드백에서 다시 시작한 원인 분석.

문제
  • pnpm update 후 변경할 값이 없어도 pnpm-workspace.yaml catalog의 따옴표가 사라지는 버그 (#10425)
해결
  • 첫 제출은 코드만 읽고 대입만 막아 효과가 없었고(재작성 플래그는 그대로), 메인테이너가 테스트와 함께 지적
  • 값이 하나도 바뀌지 않아도 재작성 플래그가 무조건 켜지는 것을 원인으로 다시 짚음
  • 플래그를 조건 안으로 옮겨 값이 실제로 바뀔 때만 켜지도록 수정 (+4 / −3줄)
  • 두 번째는 코드보다 재현을 먼저: 따옴표를 섞은 테스트 프로젝트에서, 수정 없는 소스 빌드로 재현을 확인한 뒤 수정본과 비교
결과
  • 2026-01-26 머지, pnpm v11.0.0(2026-04) 릴리스 노트에 실림
  • 불필요한 재작성을 막아 증상을 없앰. 재작성 시 따옴표가 사라지는 원인 자체는 확정하지 못함
최종 소스 변경
+4 / −3줄
첫 제출 → 머지
17일 (2026-01-09 → 01-26)
포함된 릴리스
pnpm v11.0.0

이슈

#10425로 올라온 버그였습니다. pnpm update를 실행하면 pnpm-workspace.yaml의 catalog 항목에서 따옴표가 사라졌습니다. 업데이트할 게 없다는 "Already up to date"가 떠도 마찬가지였습니다.

# pnpm update 전
catalog:
  'zod': '3.24.3'

# pnpm update 후 — 값은 그대로인데 따옴표만 사라짐
catalog:
  zod: 3.24.3

첫 제출 — 효과가 없었다

코드를 읽고 workspace/manifest-writer의 addCatalogs에서 값을 대입하는 부분이 원인이라고 봤습니다. 값이 같으면 다시 대입하지 않도록 조건을 걸었고, 실제 pnpm update로는 확인하지 않고 제출했습니다.

메인테이너의 답은 이 변경이 아무것도 하지 않는다는 것이었습니다. 수정 없이도 따옴표가 보존된다며 직접 테스트까지 추가해 보여 줬습니다.

맞는 지적이었습니다. 대입은 막았지만, 파일을 다시 쓸지 정하는 shouldBeUpdated 플래그는 루프 뒤에서 여전히 무조건 true가 되고 있었습니다. 같은 값을 다시 넣는 건 원래도 해가 없었으니, 동작은 전과 같았습니다.

첫 커밋에는 에디터 포매터가 파일 전체를 다시 정렬한 변경도 섞여 있어서, 따로 되돌렸습니다.

다시 보기 — 대입이 아니라 플래그

이번에는 코드보다 재현을 먼저 만들었습니다. 따옴표를 섞어 쓴 pnpm-workspace.yaml로 테스트 프로젝트를 따로 만들고, 소스에서 빌드한 pnpm을 pnpm link로 연결해 원래 명령과 번갈아 돌리며 결과를 비교했습니다. 수정을 빼고 빌드한 main 소스에서도 같은 증상이 재현되는 것을 먼저 확인했습니다. 그래야 전후 차이가 이 수정 때문이라고 말할 수 있기 때문입니다.

그렇게 파일 쓰기를 결정하는 쪽으로 거슬러 올라가니, 값이 하나도 바뀌지 않아도 파일을 다시 쓴다는 점이 드러났습니다.

플래그를 조건 안으로 옮겨, 값이 실제로 바뀔 때만 켜지게 했습니다.

       targetCatalog ??= {}
-      targetCatalog[dependencyName] = specifier
+      if (targetCatalog[dependencyName] !== specifier) {
+        targetCatalog[dependencyName] = specifier
+        shouldBeUpdated = true
+      }
     }

     if (targetCatalog == null) continue

-    shouldBeUpdated = true
-

catalog가 새로 추가되는 경우에도 모든 값이 기존에 없던 값이라 플래그가 켜집니다. 처음엔 이 경우를 위한 줄을 따로 뒀는데, 메인테이너가 중복이라며 정리했습니다. 테스트 프로젝트에서 따옴표가 유지되는 것을 확인하고 다시 리뷰를 요청했습니다.

머지

메인테이너가 중복 코드 정리와 catalog 추가 케이스 테스트를 더한 뒤 승인했고, 2026년 1월 26일 머지됐습니다. 이 수정은 pnpm v11.0.0(2026년 4월) 릴리스 노트에 실렸습니다.