codememo

Gemfile.lock 파일 이해

tipmemo 2023. 6. 2. 20:34
반응형

Gemfile.lock 파일 이해

행후실을 한 후bundle install'Gemfile' 명령입니다.lock'은 작업 디렉토리에 생성됩니다.그 파일 안에 있는 지시문은 무엇을 의미합니까?

예를 들어 다음 파일을 예로 들어 보겠습니다.

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!

'PATH', 'GEM', 'PLATFORMs' 및 'Dependencies'는 무엇을 설명합니까?모든 것이 필요합니까?

'원격' 및 '사양' 하위 지침을 포함해야 하는 항목은 무엇입니까?

'DEPLINCES' 그룹에서 보석 이름 뒤에 느낌표가 표시되는 것은 무엇을 의미합니까?

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

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

이것은 중요합니다. Gemfile.lock은 응용 프로그램을 사용자 자신의 코드와 마지막으로 모든 것이 제대로 작동했는지 확인할 때 실행된 타사 코드의 단일 패키지로 만듭니다.Gem 파일에서 의존하는 타사 코드의 정확한 버전을 지정하는 것은 일반적으로 Gem 파일의 종속성에 대한 버전 범위를 선언하기 때문에 동일한 보증을 제공하지 않습니다.

저는 지난 몇 달 동안 자동 종속성1 업데이트 도구를 구축하면서 Gemfiles와 Gemfile.locks를 많이 사용했습니다.아래는 확정적인 것과는 거리가 멀지만 Gemfile.lock 형식을 이해하는 데 좋은 출발점입니다.또한 번들러의 잠금 파일 파서에 대한 소스 코드를 체크아웃할 수도 있습니다.

Bundler 1.x에서 생성한 잠금 파일에서 다음 제목을 찾을 수 있습니다.

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

이것들은 Rubygems 서버에서 가져온 종속성입니다.그것은 Rubygems.org 에 있는 주요 루비젬스 인덱스일 수도 있고, Gemfury 및 기타에서 사용할 수 있는 것과 같은 사용자 정의 인덱스일 수도 있습니다.이 섹션에서는 다음을 볼 수 있습니다.

  • remote:의 의 행
  • specs: 번호 및 하위 종속성에 조건

GIT(선택 사항)

이러한 종속성은 지정된 Git 원격에서 발생합니다.각 Git Remote에 대해 이 섹션 중 다른 섹션이 표시되고 각 섹션 내에 다음과 같은 섹션이 표시됩니다.

  • remote:깃 리모콘예.,git@github.com:rails/rails
  • revision:은 Gemfile.lock에 잠겨.
  • tag: 파일("Gem file") 한
  • specs: 원격에서 번호 과 하위 에 대한 조건은 Git과 관련이 있습니다.

PATH(선택 사항)

이러한 종속성은 주어진 종속성에서 발생합니다.pathGem 파일에 제공됩니다.종속성에 됩니다. 각에는 다음과 같은 섹션이됩니다.

  • remote: 로경. 예:plugins/vendored-dependency
  • specs: 원격에서 번호 과 하위 에 대한 조건은 Git과 관련이 있습니다.

플랫폼

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

종속성

『 』에 입니다.Gemfile여기에 지정된 버전 제약 조건과 함께.

다른 dependencies,로된 종속성은 "Rubygems " (" "Rubygems " " " (" "git ", " " " ", " ", " " " " " " " 입니다.!즉, 해당 소스에2 "핀"되어 있음을 의미합니다(가끔 젬 파일에서 확인해야 함).

루비 버전(선택 사항)

이 Gemfile.lock이 생성되었을 때 Gemfile에 지정된 Ruby 버전. 버전 되어 있는 .ruby_version파일 대신 이 섹션은 표시되지 않습니다(Bundler는 설치 프로그램의 Ruby 버전에 관계없이 Gemfile /Gemfile.lock을 고려합니다).

번들 제품(번들러 >= v1.10.x)

Gemfile.lock을 만드는 데 사용되는 Bundler 버전입니다.파일을 만든 버전보다 오래된 경우 설치 관리자에게 번들러 버전을 업데이트하도록 알리는 데 사용됩니다.

플러그인 소스(선택 사항이며 매우 희귀함)

이론적으로 젬 파일은 번들러 플러그인과 보석을3 지정할 수 있으며, 이는 여기에 나열됩니다.실제로 2017년 7월 현재 사용 가능한 플러그인이 없습니다.번들러의 이 부분은 아직 개발 중입니다!


  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/

느낌표와 관련하여 방금 전에 발견했습니다.:git,예.

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

Bundler는 필요한 정확한 보석과 버전을 추적하고 설치함으로써 Ruby 프로젝트를 위한 일관된 환경을 제공하는 Gem 관리자입니다.

Gemfile과 Gemfile.lock은 Bundler gem이 제공하는 주요 제품입니다(Bundler 자체가 보석입니다).

Gem 파일에는 사용자가 수동으로 지정한 버전에서 언급하는 Gem에 대한 프로젝트 종속성이 포함되어 있지만 이러한 Gem은 번들러에 의해 자동으로 해결되는 다른 Gem에 종속됩니다.

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

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

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

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

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

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

  • 당신의 앱이 버전 1.5.3을 사용했고 14개월 전에 작동한다고 가정해 보겠습니다.
    문제없이, 그리고 당신은 다른 기계에 설치하려고 합니다.
    Gemfile.lock을 사용하지 않으면 버전 1.5.8이 됩니다.최신 버전의 보석으로 인해 손상된 것일 수 있으며 응용 프로그램은
    실패. 일관성을 유지하는 것이 가장 중요합니다(권장).
    연습).

번들 업데이트를 사용하여 Gemfile.lock의 gem을 업데이트할 수도 있습니다.

이는 보수적인 업데이트 개념을 기반으로 합니다.

PATH는 gemspec에서 직접 1세대 종속성을 나열하는 것처럼 보이지만 GEM은 2세대 종속성(즉, 종속성이 무엇인지)과 Gemfile에서 가져온 종속성을 나열합니다.PATH::remote는.하여 PATH을 찾은 GEM는 "gemspec"입니다. PATH::spec 파일 GEM:remote입니다.rubygems.org그곳이 GEM:: 스펙에 속하는 것을 찾기 위해 가야 했던 곳이기 때문입니다.

레일즈 플러그인에는 PATH 섹션이 표시되지만 레일즈 앱에는 표시되지 않습니다.앱에 gemspec 파일이 없기 때문에 PATH에 넣을 것이 없습니다.

종속성에 대해 gembundler.com 은 다음과 같이 언급합니다.

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

『 』 『 』 『 』에서 파일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)

는 (에서 Gemfile에 "것입니다. 즉, (1) Gemfile.lock(즉, 애플리케이션)은 "june"입니다.그래서 당신이 달릴 때bundle install"7월"은 경로뿐만 아니라 종속성에서도 볼 수 있을 뿐만 아니라 개발 단계에서만 볼 수 있습니다.생산 과정에서, 그것은 전혀 존재하지 않을 것입니다. (되지만, "7월"이되면 표시됩니다.bundle install개발뿐만 아니라 프로덕션 환경(즉, 귀사의 종속성을 포함하는 일부 다른 보석)에서도 사용할 수 있습니다.

이것들은 단지 나의 관찰일 뿐이고 나는 왜 이것들 중 어떤 것이 그런 것인지 완전히 설명할 수 없지만 나는 추가적인 논평을 환영합니다.

위에서 이야기하는 것은 명확한 문서가 없는 것 같습니다.Gemfile.lock서식을 정하다아마도 그것은Gemfile.lock내부적으로 번들에 의해 사용됩니다.

하만지 이후로, 그이로.Gemfile.lock는 의스입다니의 입니다.Gemfile그 말은 모든 정보가 여기서 나와야 한다는 것을 의미합니다.Gemfile (에 경우 에서)Gemfile).

위해서GEM그것은 당신이 직간접적으로 도입한 모든 의존성을 나열합니다.Gemfile.remoteGEM보석을 어디서 구할지 알려줍니다. 출처별로 지정됩니다.Gemfile.

▁▁fetch▁을 가져오지 않은 경우.remote,PATH찾을 위치를 알려줍니다. PATH의 정보는 의 경로에서 가져옵니다.Gemfile당신이 종속성을 선언할 때.

그리고.PLATFORM여기서.

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

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

느낌표는 "https://rubygems.org "이 아닌 소스를 사용하여 Gem을 설치했을 때 나타납니다.

언급URL : https://stackoverflow.com/questions/7517524/understanding-the-gemfile-lock-file

반응형