Bundler : Gemfile을 변경 한 후 배포 모드로 설치하려고합니다.


86

나는 번 들러와 카피 스트라 노를 처음 접했고 그것들을 함께 사용하려고 노력하고 있습니다. 배포하려고하면 다음 메시지가 표시됩니다.

Gemfile을 변경 한 후 배포 모드에서 설치하려고합니다. 다른 곳에서`bundle install '을 실행하고 업데이트 된 Gemfile.lock을 버전 제어에 추가하십시오.

불만을 제기하는 시스템을 어떻게 만족 시킬지 모르겠고 문서를 읽었 기 때문에 불만이 제기되는 이유를 이해할 수 없습니다 .

Gemfile.lock이 존재하고 Gemfile (5)을 업데이트 한 경우 번 들러는 업데이트하지 않은 모든 gem에 대해 Gemfile.lock의 종속성을 사용하지만 업데이트 한 gem의 종속성을 다시 해결합니다. . 이 업데이트 프로세스에 대한 자세한 내용은 아래의 CONSERVATIVE UPDATING에서 찾을 수 있습니다.

나는 Bundler가 내 Gemfile이 예상 한 것과 다르다는 사실을 처리 할 수 ​​있음을 의미합니다. 도움이 필요하세요?

사양 : Ruby 1.9.3, Rails 3.2.3, Capistrano 2.12.0, Bundler 1.1.4, Windows 7, Posix 머신에 배포.

편집 : 내 Gemfile에는 다음과 같은 논리 블록이 포함되어 있습니다.

unless RbConfig::CONFIG['host_os'] === 'mingw32'
  # gem 'a' ...
end

답변:


81

당신이 관련을 얻고있는 오류 메시지가 Gemfile.lock당신 때문에 할 수 Gemfile및이 Gemfile.lock서로 일치하지 않습니다. 마지막으로 실행 한 이후 bundle install(또는 update) Gemfile에서 무언가를 변경 한 것 같습니다 . 를 실행하면 bundle installGemfile에 대한 변경 사항으로 Gemfile.lock을 업데이트합니다.

bundle install로컬에서 실행 하고 Gemfile.lock그 후에 새로 업데이트 된 소스 제어에 체크인하십시오 . 그런 다음 배포를 시도하십시오.

편집 : 주석에서 알 수 있듯이 Gemfile의 조건은 한 플랫폼에서 유효한 Gemfile.lock을 생성하고 다른 플랫폼에서는 유효하지 않습니다. Gemfile에서 이러한 플랫폼 종속적 인 gem에 : platform 플래그를 제공 하면 비대칭을 해결할 수 있습니다.


2
정답처럼 들리지만 내 dev 컴퓨터에서 번들 설치를 실행 한 다음 Gemfile과 잠금을 svn으로 확인한 다음 capistrano를 사용했습니다. Gemfile에 다음과 같은 블록이 포함되어 있기 때문에 문제가 발생할 수 있습니다. unless RbConfig::CONFIG['host_os'] === 'mingw32'? (에르고는 리눅스 서버보다 내 윈도우 컴퓨터에서 다른 항목을 번들합니다.)
JellicleCat

1
아마도. Gemfile.lock의 내용을 확인하십시오. Windows에만 포함되어야하는 참조 gem이 포함되어 있습니까? 그렇다면 배포 머신에서 Gemfile과 Gemfile.lock이 다르다는 것을 의미합니다. (또한 저는 Bundler 전문가는 아니지만 Gemfile에 조건문을 넣는 것이 최선의 방법이 아니라고 확신합니다. 그룹 또는 : platform 플래그 사용을 고려하십시오 ).
Edd Morgan

2
:platforms내 prod (posix) 서버에 필요하지만 내 dev (win) 서버에는없는 gem에 플래그를 사용하면 차이가 생겼습니다. platforms :ruby do; gem 'mygem'; ...; end(이 지침을 답변에 추가해도 괜찮다면 녹색 체크 표시가 나타납니다.)
JellicleCat

: 플랫폼은 구별 할 수없는 리눅스 및 / 또는 다윈 사용 ENV :require, 너무 잘 작동 stackoverflow.com/a/16475580/933358
다니엘 W. 크롬 턴

이것은 나를 위해 일했습니다! 고맙습니다, 더 많은 좌절의 날에서 저를 구했습니다!
thenextmogul 2015 년

26

vi .bundle / config

BUNDLE_FROZEN 옵션을 '1'에서 '0'으로 변경하십시오.

"번들 설치"수행


또는

"번들 구성"실행

"고정"값이 참인지 확인하십시오. 거짓으로 설정하십시오.

번들 구성 고정 거짓


이것이 나를 위해 한 일입니다. 흥미롭게도 구성 파일 자체에서 BUNDLE_FROZEN 키가 전혀 설정되지 않았습니다. BUNDLE_FROZEN : 1을 다른 곳에 설정했을 가능성이 있습니까?
Bo G.

bundle config frozen false내 고토 수정입니다. 2 년 동안 정말 감사합니다! 나는 Joshua Pinter의 답변이 위의 의견을 다루고 있다고 믿습니다. 이에 영향을 미치는 글로벌 Bundler 구성 일 수 있습니다.
SRack

bundle config frozen false나를 위해 아무것도하지 않았습니다. 항목 BUNDLE_FROZEN = "true"(textual true) 인 .bundle / config 편집에 의지 함
Arthur

19

글로벌 번 들러 구성에주의하십시오.

내 개발 환경에서 내 개발 환경에서 생성 된 ~/.bundle/config것과 내 CI / 프로덕션 환경 Gemfile.lock에서 생성 된 것과 다른 원인이되는 내 CI / 프로덕션 환경에없는 글로벌 구성 이있었습니다.

제 경우에는 github.https개발 환경에서 true 로 설정 했지만 CI / 프로덕션 환경에는 이러한 구성이 없었습니다. 이로 인해 두 Gemfile.lock파일이 달라졌습니다.


2
감사! 이 어리석은 오류와 관련된 모든 간단한 답변 중 ---- 이것이 나를 다시 일하게 만든 것입니다. 도대체 왜 Heroku가 이것으로 자동 지원하지 않습니까? 내 인생의 마지막 3 시간을 잃어버린 참으로 절름발이의 이유!
hellion

2
당신은 내 생명을 구했을 수도 있습니다. P :이 자신을 이상 쏠 준비했다
타이론 윌슨

1
@JoshuaPinter, 네 이것이 나를 구했습니다! 몇 시간을 소비했지만 ... '번들 설치'를 할 때 표시되는 경고를 수정하려고했는데이 피클에 갇혀있었습니다. 매우 감사!
daveomcd

1
@daveomcd 머리를 긁는 데 몇 시간을 더 절약 할 수있어서 다행입니다. :)
Joshua Pinter

12

다음이 표시되면 ...

$ bundle install
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

If this is a development machine, remove the Gemfile freeze
by running `bundle install --no-deployment`.

You have added to the Gemfile:
* source: rubygems repository https://rubygems.org/
* rails (~> 3.2)
. . .

... 문제는 공급 업체 / 캐시 디렉토리에 오래된 .gem 파일이있을 가능성이 높습니다.

아마도 이전 $bundle install --deployment에 캐시에 "오래된".gem 파일을 넣는 실행 을 하셨나요?

어쨌든 다음을 실행하여이 오류를 지나칠 수 있습니다. bundle install --no-deployment

이것이 Rails의 많은 장점 중 하나입니다. 오류 메시지는 종종 문제를 해결하기 위해해야 ​​할 일을 정확히 알려줍니다.


7

내 특정 문제는 @JoshPinter가보고 한 것, 즉 번 들러가 github에서 gem을 검색하는 데 사용하는 프로토콜의 dev-vs-deploy 호스트 불일치와 관련이 있습니다.

긴 이야기를 짧게 만들기 위해 다음 Gemfile항목 을 수정하기 만하면되었습니다.

gem 'activeadmin', github: 'activeadmin'

...이 보안 구문 ( 참조 참조 ) :

gem 'activeadmin', git: 'https://github.com/activeadmin/activeadmin.git'

그리고 내 배포가 정상으로 돌아 왔습니다.


이것은 나에게도 문제를 해결했습니다. 정말 이상합니다.
여호수아 Muheim

6

나를위한 솔루션은 여기에 나열된 다른 솔루션과 약간 달랐습니다. sidekiq에서 sidekiq-pro (번 들러 1.7.12+ 필요)로 업그레이드하려고했지만 travis-ci에서 "You are trying to install in deployment mode after changes your Gemfile"메시지가 계속 나타납니다.

travis-ci의 콘솔 출력을 조사한 결과 이전 버전의 번 들러가 사용되고 있음이 드러났습니다.

제 경우에는 travis.yml 파일을 편집하여 다음을 추가해야했습니다.

before_install: - gem update bundler

이로 인해 travis-ci가 최신 버전의 번 들러를 사용하고 오류 메시지가 사라졌습니다.


이것은 Capistrano 아래에서 저를 위해 일했습니다. cap shell그리고 gem update bundler/ with <role> gem update bundler또는on <machine> gem update bundler
Eric

4

상관 없어요. 이것이 내가 한 일입니다. 그것을 고쳤습니다.

rm -rf .bundle 
rm -rf Gemfile.lock
bundle install


2

오류의 또 다른 원인 :

이것은 약간 어리석은 일이지만 다른 사람이 같은 실수를 할 것이라고 확신합니다.

Rails 4 Heroku의 경우 gem rails_12factor를 추가했습니다. 추가하기 전에 사용했다면 다음 두 가지 보석을 갖게됩니다.

gem 'rails_log_stdout',  github: 'heroku/rails_log_stdout'
gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'

새 항목을 추가 할 때 제거해야합니다. (포함되어 있습니다). gem 파일의 줄을 만질 때까지 벗어날 수 있다고 생각하면 Heroku는 중복을 발견하고 위의 오류로 울부 짖습니다.

Rails 4에서 행운을 빕니다.


1

나는 전에 비슷한 것을 만났습니다. 문제를 해결하는 한 가지 방법은 서버에서 원하는 것보다 더 많은 공간을 차지할 수 있습니다.

bundle install --deployment 

배포를 시도합니다. 이것은 모든 gem을 공급 업체 폴더에 설치하는 것과 같은 작업을 수행합니다. 일반적으로 피하는 것이 좋지만 여전히 작동 할 것입니다. 내 앱은 이와 같이 작동했지만 내 솔루션은 내 Gemfile에서 다운로드 할 정확한 버전을 제거한 다음 다시 번들링 및 배포했습니다.

gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git', :branch => 'master'

...에

gem 'rails_admin'

또는 제안 된대로 수행하고 프로덕션 서버에서 로컬 머신으로 프로젝트를 Git하고 번들링 한 다음 서버로 다시 보낼 수 있습니다. 이 솔루션은 100 % 정확하지 않을 수 있지만 일부는 저에게 효과적이었습니다 ... 제가 공유 할 것이라고 생각했습니다. 행운을 빕니다


1
--deployment나는 Gemfile.lock을 삭제하지 않는 한 플래그는 차이가 없었다. 그게 당연한 건가요?
JellicleCat

1

우리의 경우에는 프로덕션 머신에서 실행되는 이전 버전의 번 들러에서 사용할 수 없었던 기능을 사용하고있었습니다. 따라서 번 들러를 업그레이드하는 것으로 충분했습니다 gem update bundler. 즉 .


감사합니다.이 문제도 발생했습니다. 서버의 번 들러 버전이 데스크탑에서 사용하던 것보다 오래되었습니다.
Nathan Bertram

1

이것은 위험한 아이디어 일 수 있지만 프로덕션 배포 환경에서 반드시 테스트해야하는 경우 .bundle / config 파일을 편집 할 수 있습니다.

# This value is normally '1' 
# Set it to '0'
BUNDLE_FROZEN: '0'

이제 번들을 호출합니다. 제 경우에는 특정 gem을 업데이트해야하므로이 명령은

RAILS_ENV=production bundle update <whatever gem>

업데이트 후에 다시 변경해야하므로 나중에 예상대로 작동합니다. 다시 말하지만 이것은 아마도 지원되지 않을 것이며 YMMV


0

일부 gem 업데이트 후에 Nesta 앱을 배포했습니다. 무엇 나를 위해 일하는 것이었다 Gemfile.lock 삭제 실행 bundle install을 다시 생성에를 다시 배포합니다.


0

내가 한 그러나 나는 비슷한 문제로 실행 모두 bundle installbundle update 와 Heroku가 여전히 내 푸시를 거부했다.

Gemfile.lock을 삭제 한 다음 bundle install다시 실행하여 문제를 해결했습니다 . 그런 다음 추가, 커밋 및 내 git 저장소에 푸시했습니다. 그 후 나는 Heroku를 밀어 붙이는 데 아무런 문제가 없었습니다.


gemfile에서 gem 버전을 수정하지 않으면 위험합니다 .. gem을 업데이트하고 앱을 손상시킬 수 있습니다.
Abram

0

heroku의 경우 .NET Framework에서 구문을 변경할 필요가 없습니다 Gemfile. BUNDLE_GITHUB__HTTPS환경 변수로 추가 (이중 밑줄 참고)하고 true( 섹션 의 Settings탭 아래에있는 heroku 앱의 대시 보드에서 )로 설정할 수 Config Vars있습니다. 이렇게하면 이러한 모든 요청 git://https://대해 프로토콜이에서 로 전환됩니다 .


0

Heroku로 푸시를 시도 할 때 오류 메시지가 표시되었습니다. 다음 솔루션이 수정되었습니다.

  1. 힘내 풀 오리진 마스터
  2. 힘내 상태
  3. 힘내 커밋
  4. 힘내 푸시 오리진 마스터
  5. 힘내 푸시 heroku 마스터

0

이 문제는 이전 버전의 코드를 가리키는 하위 모듈과 관련이있을 수 있습니다. 저에게는 하위 모듈을 업데이트하여이 문제를 해결했습니다.

하위 모듈이있는 경우 다음을 실행 해보십시오.

git submodule update --init

bundle install


0

이 명령 후에 일반 번들 설치를 다시 수행 할 수 있습니다.

bundle install --no-deployment

0

다양한 리소스에 대한 12 개의 솔루션을 읽었지만이 상황에서 내게 도움이 될 수있는 것이 정확히 무엇인지 찾지 못했습니다.

그래서 해결책을 찾았습니다. 정확히 내가 오류 메시지를주의 깊게 읽었고 해결책이 있었다고 정확히 말하면 : Run bundle install others . "Elsewhere"는 내 앱을 개발 한 Cloud9이었습니다. 그래서 내 발걸음

  1. Gemfile 및 Gemfile.lock을 서버에서 로컬 시스템으로 복사하십시오. rsync 명령
  2. 이 두 파일을 RoR 프로젝트에 삽입하십시오 (Cloud9 사용)
  3. Gemfile을 열고 원하는대로 변경하십시오. 제 경우에는 '얇은'보석을 추가했습니다.
  4. 터미널 CD에서 Cloud9의 내 앱에 연결하고 실행하십시오. bundle install . 이 경우 변경됩니다 Gemfile.lock 버전을 갖게됩니다.
  5. 다음을 사용하여 서버에 Gemfile 및 Gemfile.lock 복사rsync
  6. 내 앱 폴더로 cd하고 다시 bundle install --deployment --without development test DONE을 실행하십시오 ! 모두에게 행운을 빕니다!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.