Gemfile.lock 파일 이해


181

'Gemfile.lockbundle install 명령을 실행 한 후 작업 디렉토리에 '이 작성됩니다. 해당 파일 내의 지시문은 무엇을 의미합니까?

예를 들어 다음 파일을 보자.

PATH
  remote: .
  specs:
    gem_one (0.0.1)

GEM
  remote: http://example.org/
  specs:
    gem_two (0.0.2)
    gem_three (0.0.3)
      gem_four (0.0.4)

PLATFORMS
  platform

DEPENDENCIES
  gem_two
  gem_one!

' 경로 ', ' 보석 ', ' 플랫폼 '및 ' 종속성 '은 무엇을 설명합니까? 그들 모두가 필요합니까?

' 원격 '및 ' 사양 '하위 지시문 에는 무엇이 포함되어야 합니까?

' DEPENDENCIES '그룹 에서 젬 이름 뒤의 느낌표는 무엇을 의미합니까?

답변:


71

들러 웹 사이트 에서 자세한 내용을 볼 수 있습니다 (편의를 위해 아래에 강조 표시).

애플리케이션을 잠시 개발 한 후 Gemfile 및 Gemfile.lock 스냅 샷 과 함께 애플리케이션을 체크인하십시오 . 이제 저장소에는 마지막으로 응용 프로그램이 작동했는지 알았을 때 사용한 모든 gem의 정확한 버전에 대한 기록이 있습니다 ...

이것은 중요합니다. Gemfile.lock 은 애플리케이션이 자신의 코드와 모든 것이 제대로 작동했는지 마지막으로 알 때 실행 된 타사 코드의 단일 패키지로 만듭니다. Gemfile에 의존하는 타사 코드의 정확한 버전을 지정해도 보석은 일반적으로 종속성에 대한 버전의 범위를 선언하므로 동일한 보장을 제공하지 않습니다.


65
이것은 그의 질문에 답하지 않았고, Gemfile.lock의 형식에 대해 묻고 있지만, 그 기능을 설명합니다.
Joshua Cheek

38

느낌표에 관해서 그냥 보석을 통해 가져온에 그것의 발견 :git, 예를 들어,

gem "foo", :git => "git@github.com:company/foo.git"

와우, 그것을 알아내는 좋은 일, 나는 이것도 궁금했다. 감사.
JP Silvashy

5
path옵션을 통해 로컬 젬을로드 할 때도 발생합니다 . 컴파일되지 않은 보석을로드하는 것과 관련이 있다고 생각합니까?
zykadelic

예, 이것이 이유입니다. 그러나 이것이 보석이 느낌표로 표시되는 유일한 이유는 아닙니다. 현재 소스 블록 내에 느낌표가 표시된 것으로 선언 된 보석이 있습니다.
Sean Moubry

35

지난 몇 개월 동안 자동화 된 종속성 업데이트 도구 1 을 구축하는 동안 Gemfiles 및 Gemfile.locks를 많이 사용했습니다 . 아래는 결정적인 것이 아니지만 Gemfile.lock 형식을 이해하기에 좋은 출발점입니다. Bundler의 lockfile 파서에 대한 소스 코드를 확인할 수도 있습니다 .

Bundler 1.x에 의해 생성 된 잠금 파일에는 다음과 같은 제목이 있습니다.

GEM (선택적이지만 매우 일반적)

이것들은 Rubygems 서버에서 공급되는 의존성입니다. Rubygems.org의 주요 Rubygems 색인이거나 Gemfury 및 기타에서 제공하는 것과 같은 사용자 정의 색인 일 수 있습니다. 이 섹션에는 다음이 표시됩니다.

  • remote: Rubygems 색인의 위치를 ​​지정하는 하나 이상의 행
  • specs: 버전 번호가있는 종속성 목록 및 하위 종속성에 대한 제약 조건

GIT (선택 사항)

이것들은 주어진 git remote에서 나온 의존성입니다. 각 git remote에 대해 다음 섹션 중 다른 섹션이 표시되며 각 섹션 내에 다음이 표시됩니다.

  • remote:자식 원격. 예 :git@github.com:rails/rails
  • revision: 커밋 참조는 Gemfile.lock이 잠겨 있습니다.
  • tag: (선택 사항) Gemfile에 지정된 태그
  • specs: 버전 번호 및 하위 종속성에 대한 제약 조건과 함께이 원격에서 발견 된 자식 종속성

PATH (선택 사항)

이것들은 pathGemfile에서 제공 되는 주어진 것에서 나온 의존성 입니다. 각 경로 종속성에 대해 다음 섹션 중 다른 섹션이 표시되며 각 섹션 내에서 다음을 볼 수 있습니다.

  • remote:경로. 예 :plugins/vendored-dependency
  • specs: 버전 번호 및 하위 종속성에 대한 제약 조건과 함께이 원격에서 발견 된 자식 종속성

플랫폼

Gemfile.lock이 생성 된 Ruby 플랫폼. Gemfile의 종속성이 플랫폼을 지정하면 해당 플랫폼에서 잠금 파일이 생성 될 때 (예 : 설치를 통해) Gemfile.lock에만 포함됩니다.

의존성

에 지정된 Gemfile버전 제약 조건과 함께에 지정된 종속성 목록입니다 .

주 Rubygems 인덱스 이외의 소스로 지정된 종속성 (예 : git 종속성, 경로 기반, 종속성)은 !해당 소스 2에 "고정"되어 있음을 의미 합니다 (때로는 Gemfile에서 확인해야 함).

RUBY VERSION (선택 사항)

이 Gemfile.lock이 생성 될 때 Gemfile에 지정된 Ruby 버전입니다. .ruby_version파일 에 Ruby 버전이 지정된 경우이 섹션은 존재하지 않습니다 (Bundler는 Gemfile / Gemfile.lock을 설치 프로그램의 Ruby 버전과 무관하게 고려하므로).

번들로 묶음 ( 번들 > = v1.10.x)

Gemfile.lock을 만드는 데 사용 된 Bundler 버전. 파일을 만든 버전보다 오래된 버전 인 경우 설치 프로그램이 Bundler 버전을 업데이트하도록 상기시키는 데 사용됩니다.

플러그인 소스 (옵션 및 매우 드문)

이론적으로 Gemfile은 Bundler 플러그인과 gem 3을 지정할 수 있으며 여기에 나열됩니다. 실제로 2017 년 7 월 현재 사용 가능한 플러그인에 대해서는 알지 못합니다. Bundler의이 부분은 아직 개발 중입니다!


  1. https://dependabot.com
  2. https://github.com/bundler/bundler/issues/4631
  3. http://andre.arko.net/2012/07/23/towards-a-bundler-plugin-system/

2
가장 좋은 답변 인 것 같습니다
daslicious

9

번 들러는 필요한 보석과 버전을 추적하고 설치하여 Ruby 프로젝트에 일관된 환경을 제공하는 Gem 관리자입니다.

Gemfile 및 Gemfile.lock은 Bundler gem에서 제공하는 기본 제품입니다 (Bundler 자체는 gem입니다).

Gemfile에는 지정된 버전으로 수동으로 언급 한 gem에 대한 프로젝트 종속성이 포함되어 있지만 해당 gem은 번 들러에 의해 자동으로 해결되는 다른 gem에 따라 다릅니다.

Gemfile.lock에는 Gemfile의 모든 gem에 대한 전체 스냅 샷과 관련 종속성이 포함되어 있습니다.

번들 설치 를 처음 호출하면 이 Gemfile.lock을 작성하고 이후의 모든 번들 설치 호출에서이 파일을 사용하여 모든 종속성이 설치되고 종속성 설치를 건너 뜁니다.

다른 컴퓨터와 코드를 공유 할 때도 마찬가지입니다.

Gemfile과 함께 Gemfile.lock을 공유하고 다른 시스템에서 번들 설치를 실행하면 Gemfile.lock을 참조하고 종속성 해결 단계를 건너 뜁니다. 대신에 사용한 것과 동일한 종속 gem을 모두 설치합니다. 여러 머신에서 일관성유지 하는 원래 머신

여러 머신에서 일관성을 유지해야하는 이유는 무엇입니까?

  • 다른 컴퓨터에서 다른 버전을 실행하면 코드가 손상 될 수 있습니다

  • 앱이 버전 1.5.3을 사용했으며 14 개월 전에
    아무런 문제없이 작동한다고 가정하고
    Gemfile.lock이없는 다른 컴퓨터에 설치하려고 하면 버전 1.5.8을 얻습니다. 어쩌면 최신 버전의 일부 보석이 손상되어 응용 프로그램이
    실패 할 수 있습니다. 일관성을 유지하는 것이 가장 중요합니다 (바람직한
    관행).

bundle update 를 사용하여 Gemfile.lock에서 gem을 업데이트 할 수도 있습니다 .

이것은 보수적 업데이트 의 개념을 기반으로합니다.


8

PATH는 gemspec에서 직접 1 세대 종속성을 나열하는 반면 GEM은 2 세대 종속성 (즉, 종속성이 의존하는 항목)과 Gemfile의 종속성을 나열하는 것처럼 보입니다. PATH :: remote는 .PATH :: spec에 속하는 것을 찾기 위해 현재 디렉토리의 로컬 gemspec에 의존하기 때문에 GEM :: remote는 rubygems.org이므로 GEM :에 속하는 것을 찾기 위해 가야했기 때문입니다. : 투기.

Rails 플러그인에는 PATH 섹션이 표시되지만 Rails 앱에는 표시되지 않습니다. 앱에 gemspec 파일이 없으므로 PATH에 넣을 항목이 없습니다.

gembundler.com 은 DEPENDENCIES와 관련 하여 다음 과 같이 말합니다.

Runtime dependencies in your gemspec are treated like base dependencies, 
and development dependencies are added by default to the group, :development

에 의해 생성 된 Gemfile rails plugin new my_plugin은 비슷한 것을 말합니다 :

# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.

이것이 의미하는 것은

s.add_development_dependency "july" # (1)

s.add_dependency "july" # (2)

(1)은 개발 환경에서 Gemfile.lock (및 응용 프로그램)에 "july"만 포함한다는 것입니다. 따라서을 실행 bundle install하면 PATH뿐만 아니라 DEPENDENCIES에서도 "july"가 표시되고 개발 단계에서만 표시됩니다. 프로덕션에서는 전혀 존재하지 않습니다. 그러나 (2)를 사용하면 DEPENDENCIES가 아닌 PATH에만 "july"가 표시되지만bundle install 프로덕션 환경 (예 : 종속성으로 포함하는 다른 gem)에서는 그렇지 않습니다. 개발 만.

이것들은 저의 관찰 결과이며 이것이 왜 그런지 설명 할 수는 없지만 추가 의견을 환영합니다.


3

Gemfile.lock형식 에 대한 명확한 문서는 없습니다 . Gemfile.lock내부적으로 번들에 의해 사용 되기 때문일 수 있습니다.

그러나 Gemfile.lock의 스냅 샷이므로 Gemfile모든 정보가 Gemfile(또는에 지정되지 않은 경우 기본값에서 Gemfile) 제공되어야합니다.

의 경우 GEM에 직접 또는 간접적으로 소개하는 모든 종속성이 나열됩니다 Gemfile. remote아래 에서 소스GEM통해 지정된 gem을 가져올 위치를 알려줍니다 .Gemfile

보석이에서 가져 오지 않은 경우 remote, PATH그것을 찾을 수있는 위치를 알려줍니다. PATH의 정보는 의존성을 선언 할 때 경로 에서 제공 Gemfile됩니다.

그리고 PLATFORM출신 여기 .

의 경우 DEPENDENCIES번들로 해결 된 종속성의 스냅 샷입니다.


0

'DEPENDECIES'그룹에서 보석 이름 다음에 느낌표는 무엇을 의미합니까?

" https://rubygems.org " 이외의 소스를 사용하여 gem을 설치하면 느낌표가 나타납니다 .

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