gitgitore에 Gemfile.lock이 포함되어야합니까?


501

나는 번 들러와 그것이 생성하는 파일에 익숙하지 않습니다. 많은 사람들이 기여한 GitHub의 git repo 사본이 있으므로 번 들러가 repo에 존재하지 않았고 목록에없는 파일을 생성한다는 사실에 놀랐습니다 .gitignore.

내가 포크 한 이후에 repo에 추가해도 메인 repo에 아무런 영향을 미치지 않지만 풀 요청을하면 문제가 발생합니까?

Gemfile.lock저장소에 포함 되어야합니까 ?



2
동일한 저장소를 공유하는 Linux 및 Windows 상자가 있기 때문에 여기에서 길을 찾았다면 Joe Yang의 답변을 참조하십시오. 내가 글을 쓰는 시점에서 이것은 3 위입니다. 또한 참조 stackoverflow.com/questions/14034561/...
피터 버그

답변:


549

루비 젬을 작성하지 않는다고 가정하면 Gemfile.lock은 저장소에 있어야합니다. 필요한 모든 보석과 그 의존성의 스냅 샷으로 사용됩니다. 이 방법으로 번 들러는 배포 할 때마다 모든 gem 의존성을 다시 계산할 필요가 없습니다.

아래의 cowboycoded의 의견에서 :

gem 작업을하고 있다면 Gemfile.lock을 체크인하지 마십시오. Rails 앱을 사용하고 있다면 Gemfile.lock을 확인하십시오.

잠금 파일이 무엇인지 설명 하는 멋진 기사 가 있습니다.


88
작업중인 내용에 따라 다릅니다. gem 작업을하고 있다면 Gemfile.lock을 체크인하지 마십시오. Rails 앱을 사용하고 있다면 Gemfile.lock을 확인하십시오. 자세한 정보는 여기 -yehudakatz.com/2010/12/16/…
johnmcaliley

유용한 기사를위한 Thx.
ashisrai_

1
당신은 카우보이 코드가 대답 re : gems에 말한 것을 넣어야합니다.
aarona

기사 링크에는 새로운 href가 필요합니다.
Ross

4
제발하지 마세요 !! Gemfile.lock을 그대로 유지하십시오! 여기여기에 말한 것처럼 .
Ricardo Ruwer

50

실제 문제는 구성 가능한 데이터베이스 어댑터가 필요한 오픈 소스 Rails 앱에서 작업 할 때 발생합니다. Fat Free CRM의 Rails 3 브랜치를 개발 중입니다. 선호하는 것은 postgres이지만 기본 데이터베이스는 mysql2가되기를 원합니다.

이 경우 Gemfile.lock여전히 기본 gem 세트로 체크인해야하지만 내 컴퓨터에서 변경 한 사항은 무시해야합니다. 이를 위해 다음을 실행합니다.

git update-index --assume-unchanged Gemfile.lock

그리고 반대로 :

git update-index --no-assume-unchanged Gemfile.lock

에 다음 코드와 같은 것을 포함시키는 것도 유용합니다 Gemfile. 이는 database.yml을 기반으로 적절한 데이터베이스 어댑터 젬을로드합니다.

# Loads the database adapter gem based on config/database.yml (Default: mysql2)
# -----------------------------------------------------------------------------
db_gems = {"mysql2"     => ["mysql2", ">= 0.2.6"],
           "postgresql" => ["pg",     ">= 0.9.0"],
           "sqlite3"    => ["sqlite3"]}
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml"))
  db = YAML.load_file(db_config)
  # Fetch the first configured adapter from config/database.yml
  (db["production"] || db["development"] || db["test"])["adapter"]
else
  "mysql2"
end
gem *db_gems[adapter]
# -----------------------------------------------------------------------------

이것이 확립 된 모범 사례인지 아닌지는 말할 수 없지만 그것은 나에게 잘 작동합니다.


2
매우 유용한 정보 ... 왜 3 점 만 가지고 있고 덜 유용한 대답에는 50 점이 있는지 잘 모르겠습니다. 예, 날짜 기록을보십시오. (SO의 가장 큰 실패 중 하나는 질문을 한 직후에 응답하여 발생하는 불균형적인 이점입니다.)
iconoclast

1
@ iconoclast : 당신이 한 일을 게시하게되어 기쁩니다. 나는이 게시물에 온 많은 사람들이 질문 제목에 의해 "눈을 멀게"했다고 생각합니다. 내 대답은 특정 사용 사례에만 대답하고 반드시이 질문에 대한 올바른 대답은 아닙니다. 가까운 시일 내에 업데이트 할 것입니다. 즉, OP가 자신의 요구를 충족시키지 못하면 내 대답이 올바른 것으로 표시되어서는 안됩니다.
rwilliams

34

우리는 다른 플랫폼, 창 및 Mac을 사용하고 서버는 Linux이기 때문에 직장 동료와 Gemfile.lock이 다릅니다.

우리는 repo에서 Gemfile.lock을 제거하고 database.yml과 마찬가지로 git repo에서 Gemfile.lock.server를 생성하기로 결정했습니다. 그런 다음 서버에 배포하기 전에 cap deploy hook을 사용하여 서버의 Gemfile.lock.server를 Gemfile.lock에 복사합니다.


5
OSX에서 개발 한 다음 Windows 서버에 배포해야하는 앱이 있습니다. git으로 Gemfile.lock을 추적하면 나쁜 생각으로 판명되어 내 .gitignore 파일에 들어갔습니다. 많은 보석은 환경에 따라 다른 버전이 필요합니다. 이상적으로는 이런 상황에 처하지 말아야하지만 선택의 여지가 없었습니다 (IT 부서를
망쳤습니다

11

r-dub에 동의하면 소스 제어로 유지하지만 실제 이점은 다음과 같습니다.

동일한 환경에서의 협업 (windohs 및 linux / mac 항목 무시) Gemfile.lock 이전에 프로젝트를 설치 한 다음 친구는 모든 종류의 혼란스러운 오류를보고 자신을 비난 할 수있었습니다.

더 나쁜 것은, 이것은 서버에서 일어 났으며, 훈련되지 않고 정확한 버전을 설치하지 않는 한 테스트되지 않은 버전을 얻었습니다. Gemfile.lock은 이것을 명시 적으로 만들고 버전이 다르다는 것을 명시 적으로 알려줍니다.

참고 : : development 및 : test와 같이 항목을 그룹화해야합니다.


11

번 들러 문서는이 질문에 대해서도 다룹니다.

원본 : http://gembundler.com/v1.3/rationale.html

편집 : http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

"버전 관리에 대한 코드 확인"섹션을 참조하십시오.

애플리케이션을 잠시 개발 한 후 Gemfile 및 Gemfile.lock 스냅 샷과 함께 애플리케이션을 체크인하십시오. 이제 저장소에는 마지막으로 응용 프로그램이 작동했는지 알았을 때 사용한 모든 gem의 정확한 버전에 대한 기록이 있습니다. Gemfile에 세 가지 보석 (버전이 엄격함이 다른 보석) 만 나열되어 있지만 응용 프로그램은 사용자가 의존하는 보석의 모든 암시 적 요구 사항을 고려하면 수십 개의 보석에 의존합니다.

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

다음에 동일한 시스템에서 번들 설치를 실행할 때 번 들러는 필요한 모든 종속성이 이미 있음을 확인하고 설치 프로세스를 건너 뜁니다.

.bundle 디렉토리 또는 그 안의 파일을 체크인하지 마십시오. 이러한 파일은 각 특정 머신에 따라 다르며 bundle install 명령 실행간에 설치 옵션을 유지하는 데 사용됩니다.

번들 팩을 실행 한 경우 번들에 필요한 gem (git gem은 아니지만)이 공급 업체 / 캐시로 다운로드됩니다. 필요한 모든 보석이 해당 폴더에 있고 소스 컨트롤에 체크인 된 경우 번 들러는 인터넷 (또는 RubyGems 서버)에 연결하지 않고도 실행할 수 있습니다. 이 단계는 선택적 단계이며 소스 제어 저장소의 크기 증가로 인해 권장되지 않습니다.


4

Gemfile.lock이 없음을 의미합니다.

  • 새로운 기고자들은 이상한 일이 실패하기 때문에 테스트를 실행할 수 없으므로 PR에 기여하거나 실패하지 않습니다 ... 나쁜 첫 경험.
  • 로컬 Gemfile을 잃어버린 경우 도끼 오래된 프로젝트로 돌아가서 프로젝트를 업데이트 / 다시 작성하지 않고도 버그를 수정할 수 없습니다.

-> 항상 Gemfile.lock을 체크인 하십시오.


3

파티에 조금 늦었지만 응답이 여전히이 문제를 이해하는 데 시간과 외국 독서를했습니다. 그래서 Gemfile.lock에 대해 찾은 것을 요약하고 싶습니다.

Rails 앱을 빌드 할 때 로컬 머신에서 특정 버전의 gem을 사용하고 있습니다. 프로덕션 모드 및 다른 브랜치에서 오류를 방지하려면 해당 Gemfile.lock 파일을 어디에서나 사용해야하고 번 들러에게bundle 하고 변경 될 때마다 gem을 다시 빌드 .

경우 Gemfile.lock생산 시스템에 변경 및 망할 놈의 당신을 허용하지 않습니다 git pull, 당신이 작성해야 git reset --hard하는 파일 변경을 방지하고 쓸 git pull다시.


예를 들어 빌드 프로세스에 의해 파일이 자동으로 변경되면 파일을 버전 관리에 추가해서는 안된다는 명백한 신호입니다.
Thomas S.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.