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.lockyarn 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.