yarn.lock 파일을 커밋해야하며 무엇을위한 것입니까?


304

원 사는 yarn.lock을 수행 한 후 파일을 만듭니다 yarn install.

이것이 저장소에 커밋되거나 무시되어야합니까? 무엇입니까?


3
IMHO,이 질문 (및 대부분의 아래 답변)은 "얀 및 얀 파일을 언제 어떻게 재생해야합니까?"라는 질문을 놓쳐서 불완전합니다.
— MarkHu 2016 년

1
어떻게 언제 어떻게 알 수 있습니까?
— jayarjo

@MarkHu는 여기에서 찾았습니다. yarnpkg.com/lang/en/docs/yarn-lock/#toc-managed-by-yarn 기본적으로 :Your yarn.lock file is auto-generated and should be handled entirely by Yarn. As you add/upgrade/remove dependencies with the Yarn CLI, it will automatically update your yarn.lock file.
— jayarjo

답변:


271

예, 체크인해야합니다. npm에서 마이그레이션을 참조하십시오.

Yarn은 패키지의 루트 디렉토리 내에 yarn.lock 파일을 생성합니다. 이 파일을 읽거나 이해할 필요가 없습니다. 소스 제어로 확인하십시오.


33
좋은 발견. 문서 에서 "무엇을위한 것입니까?"라는 대답을 찾았습니다 . "npm 클라이언트는 node_modules 디렉토리에 종속성을 비 결정적으로 설치합니다. 이는 순서 종속성에 따라 node_modules의 구조가 설치됨을 의미합니다. 디렉토리는 사람마다 다를 수 있습니다 이러한 차이로 인해 "내 시스템에서 작동"버그가 발생하여 시간이 오래 걸립니다. "
— rlay3

13
계속 : "원 사는 잠금 파일과 결정적이고 신뢰할 수있는 설치 알고리즘을 사용하여 버전 관리 및 비결 정성에 관한 이러한 문제를 해결합니다.이 잠금 파일은 설치된 종속성을 특정 버전으로 잠그고 모든 설치가 동일한 파일 구조를 갖도록합니다. 모든 머신에서 node_modules "
— rlay3

"lockfile을 찾을 수 없습니다"라고 말하는 대신. "Generating yarn.lock 파일"이라고 말하면됩니다. Duh :) 오류는 아니지만 전자가 오류처럼 들립니다. 그리고 후자는 역 시나리오의 사람들에게 충분히 경고 할 것입니다.
— Alexander Mills

7
yarn.lock이 프로젝트를 특정 패키지 버전으로 잠그는 것에 감사하지만 "lock"이라는 단어를 사용하는 것이 불행하다고 생각합니다. 일반적으로 잠금 파일 (예 : .ldb )은 중단 된 업데이트로 인해 발생할 수있는 손상을 방지하기 위해 한 번에 하나의 프로세스로 리소스를 제한하는 수단입니다. 이러한 잠금 파일은 버전 제어에 전념해서는 안되며, 이는 yarn.lock에 대한 혼란의 대부분이 원인 일 수 있습니다.
— Antony

2
"이 파일을 읽거나 이해할 필요가 없습니다"라는 문구가 마음에 들지 않습니다. 프로젝트를 유지 관리하는 데 중요한 파일입니다.
— Nathan Goings

83

프로젝트가 무엇인지에 따라 다릅니다.

  1. 프로젝트가 응용 프로그램입니까? 그런 다음 예
  2. 프로젝트가 도서관입니까? 그렇다면 : 아니오

이에 대한 자세한 설명 은 Yarn 제작자 중 하나 인 GitHub 문제 에서 확인할 수 있습니다 . 말한다 :

package.json은 원래 작성자가 원하는 의도 된 버전을 설명하고 yarn.lock은 주어진 응용 프로그램에 대해 마지막으로 알려진 올바른 구성을 설명합니다.

yarn.lock최상위 프로젝트 의 -file 만 사용됩니다. 따라서 하나의 프로젝트를 독립형으로 사용하고 다른 프로젝트에 설치하지 않는 한 yarn.lock-file 을 커밋하는 데는 아무 소용이 없습니다. 대신 package.json프로젝트가 기대하는 버전의 종속성을 전달하는 것은 항상 -file에 달려 있습니다.


7
다른 한편으로, 라이브러리 프로젝트에 잠금 파일이없는 것이 각각의 테스트의 재현성에 영향을 미치지 않습니까?
— E_net4 근접 유권자

1
설명을 올바르게 읽으면 "프로젝트가 라이브러리입니까?"보다 "원하는 경우"로 대답 할 수 있습니다. 단점이없는 것처럼 보이지만 복잡한 devDependencies가 있고 모든 lib 개발자가 동일한 빌드 및 테스트 스크립트를 갖기를 원한다면 유용 할 수 있습니다. 권리?
— Pipo

4
잠금 파일은 라이브러리 사용자에게 존중되지 않으므로 라이브러리를 개발할 때이 파일에 의존하면 잘못된 보안 감각이
— 생길 수 있습니다.

1
Dart는 pubspec.yaml 및 pubspec.lock과 동일한 시스템을 가지고 있으며 답변과 동일한 시스템을 권장합니다. 이 질문 과이 설명서 항목을 참조하십시오 .
— Jonas Kello

16
Yarn의 공식 블로그에서이 항목을 참조하십시오 . 모든 프로젝트에서 잠금 파일을 커밋해야합니다.
— 유권자 E_net4

66

나는 이것들이 하나의 두 가지 질문이라는 것을 알았습니다. 둘 다 대답하겠습니다.

파일을 리포지토리에 커밋해야합니까?

예. ckuijjer의 답변 에서 언급했듯이 마이그레이션 안내서 에서이 파일을 리포지토리 에 포함 시키는 것이 좋습니다 . 왜해야하는지 이해하려면 계속 읽으십시오 .

무엇입니까 yarn.lock?

각 패키지의 체크섬과 함께 프로젝트의 정확한 종속성 버전을 저장하는 파일입니다. 이것은 의존성에 일관성을 제공하는 원사의 방법입니다.

이 파일이 필요한 이유를 이해하려면 먼저 원래 NPM의 문제가 무엇인지 이해해야합니다 package.json. 패키지를 설치할 때 NPM은 특정 개정 (semver) 대신 종속성의 허용 된 개정 범위를 저장합니다. NPM은 지정된 범위 내에서 최신 버전의 종속성 종속성을 가져 오려고 시도합니다 (즉, 최신 패치 업데이트가 아님). 이 방법에는 두 가지 문제가 있습니다.

  1. 종속성 작성자는 실제로 프로젝트에 영향을 미치는 주요 변경 사항을 도입하면서 패치 버전 업데이트를 릴리스 할 수 있습니다.

  2. npm install다른 시간에 실행중인 두 개발자 는 서로 다른 종속성 집합을 얻을 수 있습니다. 정확히 동일한 두 환경에서 버그를 재현 할 수없는 원인이 될 수 있습니다. 예를 들어 CI 서버의 빌드 안정성 문제가 발생할 수 있습니다.

반면에 원 사는 최대 예측 가능성의 경로를 따릅니다. 정확한 종속성 버전 yarn.lock을 저장하기 위해 파일을 작성 합니다 . 해당 파일을 원사로 사용하면에서 버전 을 확인하는 대신 저장된 버전을 사용 합니다. 이 전략은 위에서 설명한 문제가 발생하지 않도록합니다.yarn.lockpackage.json

yarn.lock명령 npm-shrinkwrap.json으로 만들 수있는 것과 비슷합니다 npm shrinkwrap. 이 두 파일의 차이점을 설명하는 이 답변을 확인하십시오 .


1
하지만 yarn.lock지금 업데이트되는 것을 볼 수 있습니다. 왜 그리고 언제 그런지 알고 yarn있습니까?
— jayarjo

1
원사 문제 # 4379 및 # 4147 은 package.json을 변경하지 않고 실행하는 것을 포함하여 대부분의 경우 yarn업데이트 yarn.lock를 제안합니다 yarn install. 사용 yarn install --frozen-lockfile에 제안 이유는이 창에 실을 실행하는 일은 yarn.lock을 변경 (또는 통해 구성 .yarnrc) 최선의 방법처럼 보인다.
— Lauri Harpf

현재 npm에는 a package-lock.json및 a가 npm ci있습니다. 그 흐름은 유사 원사의입니다 yarn.lock및 yarn install --frozen-lockfile.
— k0pernikus


8

당신은해야합니다 :

  1. 저장소에 추가하고 커밋하십시오.
  2. 로컬 및 CI 빌드 서버 모두에서 기본값이 yarn install --frozen-lockfile아닌 NOT yarn install을 사용하십시오 .

(나는 정지 잠금 파일을 기본 동작으로 만들기 위해 실의 이슈 트래커에서 티켓을 열었습니다 . # 4147 참조 ).


package.json 및 yarn.lock 파일을 동기화 할 수 없으므로 파일에 frozen-lockfile플래그를 설정하지 마십시오 .yarnrc. github 의 관련 원사 문제를 참조하십시오


yarn install예상치 못한 원사를 변경시킬 수 있습니다 . yarn installyarn.lock을 초기화하고 업데이트 할 때만 사용해야 합니다.

또한, esp. 대규모 팀에서는 개발자가 로컬 프로젝트를 설정했기 때문에 원사 잠금 변경에 많은 소음이 발생할 수 있습니다.

자세한 내용 은 여기에 적용되는 npm의 package-lock.json에 대한 내 대답을 읽으십시오 .


이것은 최근 에 원사 설치 문서 에서 분명해졌습니다 .

yarn install

로컬 node_modules 폴더의 package.json에 나열된 모든 종속성을 설치하십시오.

yarn.lock다음과 같이 파일이 사용된다 :

  • yarn.lock이 있고 package.json에 나열된 모든 종속성을 충족하기에 충분하면 yarn.lock에 기록 된 정확한 버전이 설치되고 yarn.lock은 변경되지 않습니다. 원 사는 최신 버전을 확인하지 않습니다.
  • yarn.lock이 없거나 package.json에 나열된 모든 종속성을 충족하기에 충분하지 않은 경우 (예 : package.json에 수동으로 종속성을 추가하는 경우) Yarn은 패키지의 제약 조건을 충족하는 최신 버전을 찾습니다. .json. 결과는 yarn.lock에 기록됩니다.

yarn.lock이 업데이트되지 않도록하려면 --frozen-lockfile.


진정한 동안, 나는 당신이 것이라고 생각할 수있는 유일한 시간 이 사용은 --frozen-lockfile사람이 수동으로 연속적으로 실행하지 않고 package.json을 업데이트 한 경우입니다 yarn install및 업데이트를 투입. 따라서 CI는 해당 플래그를 사용하려고 할 수 있지만 개발자는 문제를 숨기므로 개발자가 아니어야합니다.
— jkrehm

@jkrehm 문제를 숨겨서 의미하는 바에 따라 다릅니다. 풀 요청을 부풀 리거나 불필요한 병합 충돌을 일으키거나 라이브러리를 손상 시켜서으로 인해 예기치 않게 변경된 yarn.lock파일에 더 많은 문제 yarn install가 발생했습니다. (라이브러리가 semvar를 사용하기 때문에 패치 / 사소한 업데이트로 인해 앱이 중단되지 않는다는 것을 의미하지는 않습니다. 업데이트 yarn.lock는 수동 단계 일뿐 이라고 생각 합니다 . 따라서 신뢰할 수 있고 결정적이므로 개발자 컴퓨터에서도 yarn install --frozen-lockfile(및 npm cinpm 프로젝트) 의존합니다 .
— k0pernikus

1
yarn.lock2016 년 10 월 이후에 사용 된 이후 예기치 않게 업데이트 되는 문제는 없었습니다 . 항상 수동으로 작업하거나 거친 설치 후 스크립트를 수행하는 사용자였습니다. 그것이 NPM보다 Yarn을 선호하는 이유입니다 (NPM은 원하는 시간에 모든 것을 업데이트합니다). 나는 그 문제에 부딪치지 않은 행운을 생각할 것입니다.
— jkrehm

5

내 경험에 따르면 yarn.lock파일 을 커밋해야한다고 대답 합니다. 다른 사람들이 귀하의 프로젝트를 사용할 때 귀하의 프로젝트가 예상 한 것과 동일한 종속성을 갖게됩니다.

문서에서

yarn 또는 yarn add를 실행하면 Yarn은 패키지의 루트 디렉토리 내에 yarn.lock 파일을 생성합니다. 이 파일을 읽거나 이해할 필요가 없습니다. 소스 제어로 확인하십시오. 다른 사람들이 npm 대신 Yarn을 사용하기 시작하면 yarn.lock 파일을 사용하면 사용자와 정확히 동일한 종속성을 갖게됩니다.

하나는 우리가 대체하여 그것을 달성 할 수있는, 할 수있는 주장 ^과 함께 --. 예, 가능하지만 일반적으로 대부분의 npm패키지에는 ^표기법이 포함되어 있으며 정적 종속성 버전을 보장하기 위해 수동으로 표기법을 변경해야하지만, 사용 yarn.lock하는 경우 프로그래밍 방식으로 올바른 버전을 보장합니다.

또한 Eric Elliott가 말했듯 이

실을 잠그지 마십시오. "내 시스템에서 작동"버그를 피하기 위해 결정 론적 종속성 해결을 보장해야합니다.



3

예! yarn.lock의존성을 설치하는 모든 개발자가 정확히 동일한 결과를 얻도록 체크인해야합니다! 로 NPM [OCT 2016 년 사용할 수있었습니다] 예를 들어, 당신은 할 수 있습니다 patch신선한를 실행하는 새로운 개발자가있는 동안 로컬에 설치 (1.2.0 말) 버전 install다른 버전 (1.2.1)을 얻을 수있다.


1
언급 한 npm 동작은 종속성을 저장하는 방법에 따라 다릅니다. --save-exactnpm 을 사용할 때 절약 하면 동일한 동작을 수행 할 수 있습니다.
— AlicanC

4
@AlicanC 나는 그렇게 간단하지 않다고 생각합니다. 나는 커밋 된 잠금 파일을 통해 원사가 동일한 버전의 패키지 와 모든 종속성을 보장한다고 생각 합니다. . 이는 종속성의 종속성이 특정 버전에 고정되지 않을 수 있으므로 NPM이 항상 문제가 된 것이므로 새 설치에서 다른 하위 수준의 종속성이 발생할 수 있습니다. NPM shrinkwrap은이 문제를 어느 정도 해결해야했지만 항상 까다 롭고 종종 제대로 작동하지 않습니다.
— nextgentech

@nextgentech이 경우 종속성의 종속성이 올바르게 업데이트되었는지 어떻게 확인합니까? 일부 (예 : 3) 종속 패키지가있는 기본 패키지가 있다고 가정하십시오. 기본 패키지의 변경 사항을 관찰하고 package.json에서 업데이트합니다. 그러나 3 개의 하위 패키지 중 하나가 업데이트되면 변경 사항을 어떻게 얻을 수 있습니까? 잠금 파일로 인해 해당 종속성이 올바르게 업데이트되지 않습니까?
— Pragatheeswaran 2016 년

나는 아직 그것을 많이 엉망으로 만들지 않았지만 나는 그것이 yarn upgrade명령이 시작 되는 곳이라고 믿는다 . 이 명령은 모든 패키지를 업그레이드하고 잠금 파일을 다시 작성합니다. 예를 들어 프로덕션에 앱을 배포하고 종속성을 설치해야하는 경우 리포지토리에서 풀다운 된 잠금 파일을 기반으로합니다. yarn upgrade종속성 정보를 명시 적으로 변경하여 새 잠금 파일을 커밋하지 않는 한 실행해서는 안됩니다 .
— nextgentech

yarn install동일한 버전을 보장하지 않습니다. 뿐yarn install --frozen-lockfile .
— k0pernikus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.