답변:
여기 Gemfile
에서 사용할 gem을 지정하고 버전을 지정할 수 있습니다.
이 Gemfile.lock
파일은 Bundler가 설치된 정확한 버전을 기록하는 곳입니다. 이렇게하면 동일한 라이브러리 / 프로젝트가 다른 시스템에로드 될 때 실행 bundle install
하면 최신 버전을 Gemfile.lock
사용 Gemfile
하고 설치하는 것이 아니라 정확히 동일한 버전을 보고 설치합니다. (다른 시스템에서 다른 버전을 실행하면 테스트가 중단 될 수 있습니다.) 잠금 파일을 직접 편집 할 필요가 없습니다.
확인 Bundler를의 목적 및 근거 , 버전 관리 섹션에 구체적으로 확인 코드를.
일반적으로 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이 설치되고 가장 중요한 것은 모두 동일한 버전을 갖게 됩니다. 이렇게하면 안정적이고 일반적인 배포 스택이 제공됩니다.
다음과 같이 자동으로 생성됩니다.
bundle install
명령. 그 후 당신이 달릴 때마다bundle install
번들은 먼저 Gemfile.lock
거기에 지정된 gem을 찾아 설치합니다. 일관되고 안정성을 제공하기 위해이 파일을 프로젝트간에 배포하는 것이 습관입니다.
최신 버전의 앱에 만족한다면 업데이트 할 수 있습니다 Gemfile.lock
. 에 대한 변경 사항을 반영하십시오 Gemfile
. 즉, 종속성을 Gemfile
. 실행 후 :
bundle install
그러면 Gemfile.lock
최신 버전의 앱으로 업데이트 됩니다.
gem "nokogiri", "~> 1.4.4"
것은 gemfile에서 사용하여 이미 특정 버전을 지정 하고 있다는 것입니다. 번 들러가 해당 버전을 사용할 수없는 이유는 무엇입니까? 기본적으로 최신 버전의 gem을 의도적으로 설치하도록 설계 되었기 때문입니까?
~> 1.4.4
는 >= 1.4.4 and < 1.5
. bundler.io/v1.5/gemfile.html을 참조 하세요 . 정확한 버전을 보려면 gem 'foo', '1.4.4'
.
bundle install
확인하고 새로운 제한 사항을 적용한다는 내용 입니까? Gemfile
Gemfile.lock
Gemfile.lock
Gemfile.lock
번들 설치를 실행하면 Bundler는 사용한 모든 gem의 전체 이름과 버전 (Gemfile (5)에 지정된 gem의 종속성 포함)을 Gemfile.lock이라는 파일에 유지합니다.
Bundler는 번들 설치를위한 모든 후속 호출에서이 파일을 사용하므로 애플리케이션이 시스템간에 이동하는 경우에도 항상 동일한 정확한 코드를 사용할 수 있습니다.
종속성 해결이 작동하는 방식으로 인해 겉보기에 작은 변경 (예 : Gemfile (5)의 gem 종속성 포인트 릴리스 업데이트)이라도 모든 종속성을 충족하기 위해 근본적으로 다른 gem이 필요할 수 있습니다.
결과적으로 Gemfile.lock을 버전 제어로 확인해야합니다. 그렇지 않으면 저장소 (프로덕션 서버 포함)를 체크 아웃하는 모든 머신이 모든 종속성을 다시 해결하므로 Gemfile (5)에있는 gem 중 하나가 사용되는 경우 다른 버전의 타사 코드가 사용됩니다. 종속성이 업데이트되었습니다.
Gemfile.lock
경우에 '개방'버전을 포함 (예 :rails (4.0.0)
필요bundler (>= 1.3.0, < 2.0)
), 어떤 문제가 발생합니다. 이러한 '개방형'종속성을 피하는 방법을 아십니까?