Ruby on Rails에서 Gemfile과 Gemfile.lock의 차이점은 무엇입니까?


답변:


159

여기 Gemfile에서 사용할 gem을 지정하고 버전을 지정할 수 있습니다.

Gemfile.lock파일은 Bundler가 설치된 정확한 버전을 기록하는 곳입니다. 이렇게하면 동일한 라이브러리 / 프로젝트가 다른 시스템에로드 될 때 실행 bundle install하면 최신 버전을 Gemfile.lock사용 Gemfile하고 설치하는 것이 아니라 정확히 동일한 버전을 보고 설치합니다. (다른 시스템에서 다른 버전을 실행하면 테스트가 중단 될 수 있습니다.) 잠금 파일을 직접 편집 할 필요가 없습니다.

확인 Bundler를의 목적 및 근거 , 버전 관리 섹션에 구체적으로 확인 코드를.


2
즉, 방법의 해야 작동 -하지만 분명히이 Gemfile.lock경우에 '개방'버전을 포함 (예 : rails (4.0.0)필요 bundler (>= 1.3.0, < 2.0)), 어떤 문제가 발생합니다. 이러한 '개방형'종속성을 피하는 방법을 아십니까?
Guillermo Grau 2014

158

일반적으로 Gemfile에 종속성을 다음과 같이 작성합니다.

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..

여기에서는 기본적으로 " 1.4.4 버전 이상이면 nokogiri를 원합니다 ." 등을 말합니다. 이제 Gemfile 8 개월 전에 설정 했고이 요구 사항으로 앱을 성공적으로 설정 했다고 가정합니다 . 8 개월 전 nokogiri 버전은 1.4.4 입니다. 내 레일스 앱은이 버전에서 아무런 문제없이 완벽하게 실행되었습니다.

이제 내가 똑같이 만들려고한다고 생각해 Gemfile . 그러나 nokogiri 버전 을 살펴보면 현재 안정 버전이 1.4.9로 변경되었음을 알 수 있습니다. 즉, 빌드를 시도하면 번 들러가 버전 1.4.9 의 nokogiri를 설치합니다 (가 없다고 가정 Gemfile.lock).

무슨 뜻인가요 ?

당신이 아무것도 가지고 있지 않다면 보시다시피 다음을 Gemfile.lock실행하십시오.

bundle install

그러면 현재 사용되는 보석은 언제든지 다를 수 있습니다 . 앱은 1.4.4 버전을 사용했고 8 개월 전에는 아무런 문제없이 작동 하지만 지금 빌드하려고하면 하면 버전 1.4.9가 됩니다. 최신 버전의에서 손상 되었거나 1.4.4에서nokogiri 사용한 멋진 기능이 더 이상 제공되지 않는 등의 문제가있을 수 있습니다.

이러한 종류의 문제를 방지하기 위해 Gemfile.lock사용됩니다. 에서 Gemfile.lock단지 정확한 버전이 기록되며, 따라서 만이 설치됩니다. 즉,를 사용하여 앱을 배포하면 Gemfile.lock모든 머신에 동일한 gem이 설치되고 가장 중요한 것은 모두 동일한 버전을 갖게 됩니다. 이렇게하면 안정적이고 일반적인 배포 스택이 제공됩니다.

Gemfile.lock은 어떻게 생성됩니까?

다음과 같이 자동으로 생성됩니다.

bundle install

명령. 그 후 당신이 달릴 때마다bundle install 번들은 먼저 Gemfile.lock거기에 지정된 gem을 찾아 설치합니다. 일관되고 안정성을 제공하기 위해이 파일을 프로젝트간에 배포하는 것이 습관입니다.

Gemfile.lock을 업데이트하는 방법?

최신 버전의 앱에 만족한다면 업데이트 할 수 있습니다 Gemfile.lock. 에 대한 변경 사항을 반영하십시오 Gemfile. 즉, 종속성을 Gemfile. 실행 후 :

bundle install

그러면 Gemfile.lock최신 버전의 앱으로 업데이트 됩니다.


19
매우 훌륭하고 명확한 설명 (내가 찬성했습니다); 그러나 하나의 핵심 nokogiri ~> 1.4.41.5.3설치를 허용하지 않습니다 . 허용되는 최대 값은 1.4.x어디에 x>=4(노코 기리의 경우 1.4.7)입니다. ~>조작 수단 단지 마지막 자리 사용 된 보석에 지정된 버전 "초과"일 수있다. 예를 들어, {something} d 인 abc {something} 인 한 foo ~> a.b.c.d모든 버전이 괜찮음을 의미합니다 . 관련 질문 도 참조하십시오foo>=
michael

1
나를 혼란스럽게하는 gem "nokogiri", "~> 1.4.4"것은 gemfile에서 사용하여 이미 특정 버전을 지정 하고 있다는 것입니다. 번 들러가 해당 버전을 사용할 수없는 이유는 무엇입니까? 기본적으로 최신 버전의 gem을 의도적으로 설치하도록 설계 되었기 때문입니까?
Jonny

@Jonny, michael_n의 의견을 참조하십시오. ~> 1.4.4는 정확한 버전을 지정하지 않습니다.
Matthew Flaschen 2014

2
@Jonny ~> 1.4.4>= 1.4.4 and < 1.5. bundler.io/v1.5/gemfile.html을 참조 하세요 . 정확한 버전을 보려면 gem 'foo', '1.4.4'.
Matthew Flaschen 2014 년

1
좋은 대답이지만 " update Gemfile.lock? "을 명확히 해주세요 :이 섹션 은 새로운 제한 이있는 경우에도 bundle install확인하고 새로운 제한 사항을 적용한다는 내용 입니까? GemfileGemfile.lockGemfile.lock
JMess

4

Gemfile.lock

번들 설치를 실행하면 Bundler는 사용한 모든 gem의 전체 이름과 버전 (Gemfile (5)에 지정된 gem의 종속성 포함)을 Gemfile.lock이라는 파일에 유지합니다.

Bundler는 번들 설치를위한 모든 후속 호출에서이 파일을 사용하므로 애플리케이션이 시스템간에 이동하는 경우에도 항상 동일한 정확한 코드를 사용할 수 있습니다.

종속성 해결이 작동하는 방식으로 인해 겉보기에 작은 변경 (예 : Gemfile (5)의 gem 종속성 포인트 릴리스 업데이트)이라도 모든 종속성을 충족하기 위해 근본적으로 다른 gem이 필요할 수 있습니다.

결과적으로 Gemfile.lock을 버전 제어로 확인해야합니다. 그렇지 않으면 저장소 (프로덕션 서버 포함)를 체크 아웃하는 모든 머신이 모든 종속성을 다시 해결하므로 Gemfile (5)에있는 gem 중 하나가 사용되는 경우 다른 버전의 타사 코드가 사용됩니다. 종속성이 업데이트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.