깃허브 액션에서 npm ci 로 설치하는데 자꾸 이런 에러로 죽습니다. 로컬에서 npm install 하면 아무 문제 없이 되고요.
npm error `npm ci` can only install packages when your package.json and
npm error package-lock.json are in sync. Please update your lock file with
npm error `npm install` before continuing.
npm error Missing: some-lib@2.4.0 from lock file팀에서 저는 npm, 다른 분은 예전에 yarn을 쓰다가 최근에 pnpm으로 넘어가자는 얘기가 나온 상태라 레포에 package-lock.json 이랑 pnpm-lock.yaml 이 둘 다 있습니다. package.json 은 제가 어제 라이브러리 하나 추가하면서 바꿨고요.
lock 파일을 지우고 다시 만들어야 하나 싶은데, 함부로 지웠다가 팀 전체 빌드가 깨질까 봐 손을 못 대고 있습니다. 어떻게 정리하는 게 맞을까요?
댓글 4
당장 고치려면 로컬에서 npm install 한 번 더 돌려서 package-lock.json이 갱신되게 하고, 그 lock 파일을 반드시 같이 커밋해서 push 하세요. package.json 바꾸면 lock도 항상 같이 커밋한다고 생각하시면 됩니다. 그러면 CI npm ci가 통과해요.
더 큰 문제는 lock 파일이 여러 종류 섞여있는 겁니다. package-lock.json(npm)이랑 pnpm-lock.yaml(pnpm)이 같이 있으면 사람마다 다른 툴로 설치해서 서로 다른 버전이 깔리고 이런 사고가 계속 납니다. 팀에서 매니저를 하나로 정하세요. pnpm으로 갈 거면 pnpm-lock.yaml만 남기고 package-lock.json은 지우고, CI도 npm ci 대신 pnpm install --frozen-lockfile 로 바꿔야 합니다. package.json에 packageManager 필드를 박고 corepack을 쓰면 팀원들이 강제로 같은 매니저를 쓰게 돼서 이런 혼선이 사라집니다.
그래서 매니저 전환은 별도 브랜치에서 하세요. package-lock.json 지우고 pnpm install 해서 pnpm-lock.yaml 만든 다음, 그 브랜치에서 전체 테스트랑 빌드를 돌려 실제로 앱이 도는지 확인하고 머지하는 겁니다. 그냥 갈아엎지 마시고요. 또 pnpm은 기본이 엄격한 격리 구조라, 그동안 npm의 느슨한 hoisting 덕에 우연히 됐던 'package.json에 선언 안 한 의존성 직접 import' 같은 게 pnpm에선 모듈 못 찾음으로 터질 수 있습니다. 그런 게 나오면 진짜 의존성을 package.json에 제대로 추가하면 돼요. 전환 자체는 그만한 값어치가 있습니다.