Bundler: Gemfile dosyanızı değiştirdikten sonra dağıtım modunda yüklemeye çalışıyorsunuz


86

Bundler ve capistrano için oldukça yeniyim ve onları birlikte kullanmaya çalışıyorum. Dağıtmaya çalıştığımda şu mesajı alıyorum:

Gemfile dosyanızı değiştirdikten sonra dağıtım modunda yüklemeye çalışıyorsunuz. Başka bir yerde paket yüklemeyi çalıştırın ve güncellenmiş Gemfile.lock'u sürüm kontrolüne ekleyin.

Ben şikayetçi sistemini tatmin etmek nasıl bilmiyorum, ben okumak çünkü şikayet geliyor neden anlamıyorum doc :

Bir Gemfile.lock varsa ve Gemfile (5) dosyanızı güncellediyseniz, paketleyici, güncellemediğiniz tüm mücevherler için Gemfile.lock'daki bağımlılıkları kullanır, ancak güncellediğiniz mücevherlerin bağımlılıklarını yeniden çözer. . Bu güncelleme işlemi hakkında daha fazla bilgiyi aşağıdaki KORUYUCU GÜNCELLEME altında bulabilirsiniz.

Bunu, Bundler'ın Gemfile'ımın beklediği gibi olmadığı gerçeğiyle başa çıkabileceği anlamına gelecek şekilde yorumluyorum. Herhangi bir yardım?

Özellikler: Ruby 1.9.3, Rails 3.2.3, Capistrano 2.12.0, Bundler 1.1.4, Windows 7, bir Posix makinesine konuşlandırılıyor.

Düzenleme: Gemfile'ım aşağıdaki gibi mantık blokları içerir:

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

Yanıtlar:


81

Aldığınız hata mesajı Gemfile.lock, sizin Gemfileve Gemfile.lockbirbirinizle aynı fikirde olmadığınız için olabilir . Son koştuğunuzdan bundle install(veya update) bu yana Gemfile'ınızda bir şeyi değiştirmişsiniz gibi görünüyor . Siz bundle install, Gemfile.lock'unuzu Gemfile'da yaptığınız değişikliklerle günceller.

bundle installYerel olarak çalıştırdığınızdan emin olun ve Gemfile.lockbundan sonra yeni güncellediğinizi kontrol edin . Ardından dağıtmayı deneyin.

Düzenleme : Yorumlarda belirtildiği gibi, Gemfile'daki bir koşul, bir platformda geçerli bir Gemfile.lock ile sonuçlandı, diğerinde geçersiz. Gemfile'da bu platforma bağlı mücevherler için bir : platform bayrağı sağlamak asimetriyi çözmelidir.


2
Doğru cevap gibi görünüyor, ancak dev makinemde paket yüklemeyi çalıştırdım, ardından hem Gemfile'ı hem de svn'deki kilidini kontrol ettim, sonra capistrano kullandım. Sorun, Gemfile'ın aşağıdakileri içeren bir blok içermesi olabilir unless RbConfig::CONFIG['host_os'] === 'mingw32'mi? (Ergo, Windows bilgisayarımda linux sunucusundakinden farklı öğeleri paketlemelidir.)
JellicleCat

1
Büyük olasılıkla. Gemfile.lock'unuzun içeriğini kontrol edin - yalnızca Windows'a dahil edilmesi gereken referans mücevher (ler) içeriyor mu? Eğer öyleyse, bu, dağıtım makinesinde Gemfile ve Gemfile.lock'un farklı olduğunu gösterir. (Ayrıca, Bundler uzmanı değilim, ancak Gemfile'ınıza koşul koymanın en iyi uygulama olmadığına eminim. Grupları veya platform bayrağını kullanmayı düşünün ).
Edd Morgan

2
:platformsÜretim (posix) sunucumun ihtiyaç duyduğu, ancak geliştirme (kazan) sunucumda olmayan taşlar için bayrağı kullanmak fark yarattı: platforms :ruby do; gem 'mygem'; ...; end(Cevabınıza bu talimatı eklemenin sakıncası yoksa yeşil onay alırsınız.)
JellicleCat

: Platform ayırt mümkün değildir linux ve / veya darwin kullanarak env :require, iyi de çalışır stackoverflow.com/a/16475580/933358
Danıël W. Crompton

Bu benim için çalıştı! Teşekkür ederim, beni daha fazla gün süren hayal kırıklığından kurtardı!
thenextmogul

26

vi .bundle / config

BUNDLE_FROZEN seçeneğini "1" den "0" a değiştirin

"paket yükleme" yap


VEYA

"paket yapılandırması" nı çalıştır

"dondurulmuş" değerin doğru olup olmadığına bakın, yanlış olarak ayarlayın

bundle config frozen false


Bunu benim için yaptı. İlginç bir şekilde, yapılandırma dosyasının kendisinde BUNDLE_FROZEN anahtarı hiç ayarlanmadı. Merak ediyorum, BUNDLE_FROZEN: 1'i başka bir yere ayarlamış olabilir miyim?
Bo G.

bundle config frozen falsedüzeltmem. Çok teşekkürler, iki yıl sonra! Joshua Pinter'ın cevabının yukarıdaki yorumu ele aldığına inanıyorum - bunu etkileyen global Bundler yapılandırması olabilir.
SRack

bundle config frozen falsebenim için hiçbir şey yapmadı. BUNDLE_FROZEN = "true" (metinsel doğru) girişinin olduğu .bundle / config düzenlemesine başvuruldu
Arthur

19

Global Bundler yapılandırmasına dikkat edin.

Geliştirme ortamımda, geliştirici ortamımda üretilenin ~/.bundle/configCI / Üretim ortamımdakinden farklı olmasına neden olan CI / Üretim ortamım olmadığı için global bir yapılandırmam vardı Gemfile.lock.

Benim durumumda, geliştirme ortamımda github.httpsdoğruyu ayarlıyordum ancak CI / Üretim ortamımda böyle bir yapılandırma yoktu. Bu, iki Gemfile.lockdosyanın farklı olmasına neden oldu .


2
Teşekkürler! Bu saçma hatayla ilgili etrafta uçuşan tüm basit cevaplar --- işte beni işe geri döndüren şey buydu. Heroku neden buna otomatik olarak yardımcı olmuyor? Hayatımın son 3 saatini kaybetmek için ne kadar kötü bir sebep!
hellion

2
Hayatımı kurtarmış olabilirsin. Bu yüzden kendimi çekmeye hazırlanıyordum: P
Tyrone Wilson

1
@JoshuaPinter, evet bu beni kurtardı! bunun üzerine birkaç saat harcamama rağmen ... ama 'paket kurulumu' yaparken aldığım uyarıları düzeltmeye çalışıyordum ve bu turşuya takılı kaldım. Çok takdir!
daveomcd

1
@daveomcd Oradaydı, seni birkaç saat daha başını kaşındırdığına sevindim. :)
Joshua Pinter

12

Aşağıdakileri gördüğünüzde ...

$ 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)
. . .

... Daha sonra, sorun büyük olasılıkla vendor / cache dizininizde güncel olmayan .gem dosyalarınız olmasıdır.

Belki daha önce koştun $bundle install --deployment bazı "güncel olmayan" .gem dosyalarını önbelleğe koydunuz?

Her durumda, aşağıdaki komutu çalıştırarak bu hatayı aşabilirsiniz: bundle install --no-deployment

Bu, Rails ile ilgili birçok harika şeyden biridir ... hata mesajları genellikle sorunu çözmek için tam olarak ne yapmanız gerektiğini söyler.


7

Benim özel sorunum @ JoshPinter tarafından bildirilenlerle ilgiliydi, yani paketleyici tarafından github'dan mücevher almak için kullanılan protokoldeki dev-vs-deploy ana bilgisayar tutarsızlıkları.

Uzun lafın kısası, tek yapmam gereken aşağıdaki Gemfilegirişi değiştirmekti ...

gem 'activeadmin', github: 'activeadmin'

... bu güvenli söz dizimine ( referansa bakın ):

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

Ve konuşlandırmalarım normale döndü.


Bu benim için de sorunu çözdü. Gerçekten tuhaf.
Joshua Muheim

6

Benim için çözüm, burada listelenen diğerlerinden biraz farklıydı. Sidekiq'ten sidekiq-pro'ya (paketleyici 1.7.12+ gerektirir) yükseltmeye çalışıyordum, ancak travis-ci'den "Gemfile'ınızı değiştirdikten sonra dağıtım modunda yüklemeye çalışıyorsunuz" mesajını almaya devam ettim

Travis-ci'nin konsol çıktısının incelenmesi, paketleyicinin eski bir sürümünün kullanıldığını ortaya çıkardı.

Benim durumumda, eklemek için travis.yml dosyasını düzenlemem gerekiyordu:

before_install: - gem update bundler

Bu travis-ci'yi paketleyicinin en son sürümünü kullanmaya zorladı ve hata mesajının kaybolmasına neden oldu.


Capistrano'nun altında benim için çalıştı Bu çalıştırmak için cap shellve gem update bundlerya with <role> gem update bundleryaon <machine> gem update bundler
Eric

4

Umurumda değil. Ben öyle yaptım. Düzeltdi.

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


2

Hatanın başka bir nedeni:

Bu biraz aptalca, ama eminim başka biri de aynı hatayı yapacaktır.

Rails 4 için Heroku, gem rails_12factor öğesini ekledi. Eklemeden önce kullanıyorsan, şu iki cevhere sahip olacaksın:

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

Yenisini eklediğinizde onları kaldırmanız gerekir. (dahildir). Gem dosyanızdaki satırlara dokunana kadar bundan kurtulabileceğinizi düşünüyorum, ardından Heroku kopyayı fark eder ve yukarıdaki hatayla haykırır.

Rails 4 ile iyi şanslar.


1

Daha önce benzer bir şeyle karşılaştım. Bunu düzeltmenin bir yolu sanırım, ancak sunucunuzda istediğinizden daha fazla yer kaplayabilir,

bundle install --deployment 

ve sonra dağıtmayı deneyin. Bu, tüm mücevherlerinizi satıcı klasörüne yüklemek gibi bir şey yapar, ki bunu genellikle kaçınmanın iyi olduğuna inanıyorum ... ama yine de çalışacaktır. Uygulamam eskiden böyle davranırdı, benim çözümüm Gemfile'ımdan indirilecek tam sürümleri kaldırmak ve ardından yeniden dağıtmak ve dağıtmaktı.

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

-e

gem 'rails_admin'

Ya da önerdiği şeyi yapabilir ve projenizi üretim sunucusundan yerel bir makineye aktarabilir, paketleyebilir ve ardından sunucunuza yeniden aktarabilirsiniz. Bu çözüm% 100 doğru olmayabilir ama bir kısmı benim için işe yaradı ... sadece paylaşacağımı düşündüm. İyi şanslar


1
--deploymentBen Gemfile.lock silindi sürece bayrak bir fark yoktu. Öyle mi olması gerekiyor?
JellicleCat

1

Bizim durumumuzda, üretim makinemizde çalışan paketleyicinin eski bir sürümünde bulunmayan bir özelliği kullanıyorduk. Bu nedenle paketleyiciyi yükseltmek yeterliydi, yani bir gem update bundler.


Teşekkürler - Ben de bu sorunu yaşadım. Sunucudaki paketleyicinin sürümünün, masaüstlerimizde kullandığımızdan daha eski olduğu ortaya çıktı.
Nathan Bertram

1

Bu tehlikeli bir fikir olabilir, ancak bir üretim dağıtım ortamında kesinlikle bir şeyi test etmeniz gerekiyorsa .bundle / config dosyasını düzenleyebilirsiniz.

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

Şimdi paketi çağırın, benim durumumda belirli bir mücevheri güncellemem gerekiyor, bu yüzden bu benim komutum

RAILS_ENV=production bundle update <whatever gem>

Muhtemelen güncellemeden sonra tekrar değiştirmelisiniz, böylece daha sonra işler beklediğiniz gibi çalışır. Yine, bu muhtemelen desteklenmiyor ve YMMV


0

Bazı mücevher güncellemelerinden sonra bir Nesta uygulaması dağıtarak bununla karşılaştım. Benim için işe yarayan şey Gemfile.lock'u silmek,bundle install yeniden oluşturmak için çalıştırmak ve tekrar dağıtmaktı.


0

Benzer bir sorunla karşılaştım ancak ikisini de yaptım bundle installvebundle update ve Heroku hala benim itmek reddetmiştir.

Sorunu sadece Gemfile.lock'u silerek ve ardından bundle installtekrar çalıştırarak düzelttim . Daha sonra ekledim, taahhüt ettim ve bunu git depoma gönderdim. Bundan sonra Heroku'ya zorlamakta hiç sorun yaşamadım.


Eğer gemfile içinde mücevher sürümlerini sabit sürece bu risklidir .. o taşlar güncellemek ve uygulamanızı bozabilir
Abram

0

heroku için, içindeki sözdizimini değiştirmeniz gerekmez Gemfile. BUNDLE_GITHUB__HTTPSBir ortam değişkeni olarak ekleyebilir (çift alt çizgiye dikkat edin) ve bunu true( bölümdeki Settingssekmenin altındaki heroku uygulamanızın kontrol panelinde ) olarak ayarlayabilirsiniz Config Vars. bu, tüm bu tür istekler için protokolü yerine olarak git://değiştirecektir https://.


0

Heroku'ya göndermeye çalışırken hata mesajı aldım. Aşağıdaki çözümü sabit buldum.

  1. Git başlangıç ​​yöneticisini çek
  2. Git durumu
  3. Git kaydetme
  4. Git itme kaynağı yöneticisi
  5. Git heroku ustasını it

0

Bu sorun, kodun eski sürümlerine işaret eden alt modüller ile ilgili olabilir. Benim için alt modüllerimi güncelleyerek bu sorunu çözdüm

Alt modülleriniz varsa şunları çalıştırmayı deneyin:

git submodule update --init

bundle install


0

Bu komuttan sonra, normal paket kurulumunuzu tekrar yapabilirsiniz:

bundle install --no-deployment

0

Farklı kaynaklarda bir düzine çözüm okudum ancak bu durumda bana neyin yardımcı olabileceğini tam olarak bulamadım

Bu yüzden bir çözüm buldum. Tam olarak hata mesajını dikkatlice okuduğumu ve bir çözüm olduğunu söylüyorum: Başka bir yerde paket yüklemesini çalıştırın . "Başka bir yer", uygulamamı geliştirdiğim Cloud9'umdu. Benim adımlarım

  1. Gemfile ve Gemfile.lock'u sunucudan yerel makineye kopyalayın. rsync komutla
  2. bu iki dosyayı RoR projeme ekle (Cloud9 kullandım)
  3. Gemfile'ı açın ve istediğim değişiklikleri yapın. Benim durumumda mücevher 'ince' ekledim
  4. Cloud9'daki uygulamama terminal cd'de ve çalıştırın bundle install. bu durumda Gemfile.lock'un değiştirilmiş bir sürümüne sahip olacaksınız.
  5. kullanarak sunucuya yeni Gemfile ve Gemfile.lock kopyalayınrsync
  6. uygulama klasörüme cd ve tekrar bundle install --deployment --without development test BİTTİ çalıştır ! Herkese iyi şanslar dileyin!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.