Bundler: Anda mencoba menginstal dalam mode penerapan setelah mengubah Gemfile Anda


86

Saya cukup baru mengenal bundler dan capistrano, dan saya mencoba menggunakannya bersama. Ketika saya mencoba menerapkan, saya mendapatkan pesan:

Anda mencoba menginstal dalam mode penerapan setelah mengubah Gemfile Anda. Jalankan `bundle install 'di tempat lain dan tambahkan Gemfile.lock yang telah diperbarui ke kontrol versi.

Saya tidak tahu bagaimana memuaskan sistem yang mengeluh, dan saya tidak mengerti mengapa keluhan itu muncul karena saya membaca di dokumen :

Jika Gemfile.lock memang ada, dan Anda telah memperbarui Gemfile (5) Anda, bundler akan menggunakan dependensi di Gemfile.lock untuk semua permata yang tidak Anda perbarui, tetapi akan menyelesaikan kembali dependensi permata yang Anda perbarui . Anda dapat menemukan informasi lebih lanjut tentang proses pembaruan ini di bawah PEMBARUAN KONSERVATIF.

Saya menafsirkannya sebagai Bundler dapat menangani fakta bahwa Gemfile saya tidak seperti yang diharapkan. Ada bantuan?

Spesifikasi: Ruby 1.9.3, Rails 3.2.3, Capistrano 2.12.0, Bundler 1.1.4, Windows 7, diterapkan ke mesin Posix.

Sunting: Gemfile saya menyertakan blok logika seperti berikut:

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

Jawaban:


81

Pesan kesalahan yang Anda terima Gemfile.lockmungkin karena Anda Gemfiledan Gemfile.locktidak setuju satu sama lain. Sepertinya Anda telah mengubah sesuatu di Gemfile Anda sejak terakhir kali Anda menjalankan bundle install(atau update). Saat Anda bundle install, itu memperbarui Gemfile.lock Anda dengan perubahan apa pun yang Anda buat pada Gemfile.

Pastikan Anda menjalankan bundle installsecara lokal, dan check-in untuk mengontrol sumber Anda yang baru saja diperbarui Gemfile.locksetelah itu. Kemudian coba terapkan.

Sunting : Seperti yang dikenali di komentar, kondisi di Gemfile menghasilkan Gemfile.lock yang valid di satu platform, tidak valid di platform lain. Menyediakan tanda : platform untuk permata yang bergantung pada platform ini di Gemfile harus menyelesaikan asimetri.


2
Kedengarannya seperti jawaban yang benar, tetapi saya menjalankan bundle install di mesin dev saya, lalu memeriksa Gemfile dan kuncinya ke svn, lalu menggunakan capistrano. Bisa menjadi masalah karena Gemfile termasuk blok dengan: unless RbConfig::CONFIG['host_os'] === 'mingw32'? (Ergo itu harus menggabungkan item yang berbeda di komputer windows saya daripada di server linux.)
JellicleCat

1
Sangat mungkin. Periksa konten Gemfile.lock Anda - apakah itu berisi permata referensi yang hanya boleh disertakan di Windows? Jika demikian, itu menunjukkan bahwa pada mesin penerapan, Gemfile dan Gemfile.lock berbeda. (Juga, saya bukan ahli Bundler, tapi saya cukup yakin menempatkan persyaratan dalam Gemfile Anda bukanlah praktik terbaik. Pertimbangkan untuk menggunakan grup atau : bendera platform ).
Edd Morgan

2
Menggunakan :platformsbendera untuk permata yang diperlukan server prod (posix) saya tetapi yang tidak ada di server dev (win) saya membuat perbedaan: platforms :ruby do; gem 'mygem'; ...; end(Anda mendapatkan centang hijau jika Anda tidak keberatan menambahkan instruksi ini ke jawaban Anda.)
JellicleCat

: platform tidak dapat membedakan antara linux dan / atau darwin env yang digunakan :require, bekerja dengan baik juga stackoverflow.com/a/16475580/933358
Daniël W. Crompton

Ini berhasil untuk saya! Terima kasih, selamatkan saya dari hari-hari frustrasi lainnya!
thenextmogul

26

vi. bundle / config

ubah opsi BUNDLE_FROZEN dari '1' menjadi '0'

lakukan "bundle install"


ATAU

jalankan "bundle config"

lihat apakah nilai "beku" adalah benar setel ke salah

bundle config frozen false


Inilah yang melakukannya untuk saya. Menariknya, di file config itu sendiri, kunci BUNDLE_FROZEN tidak disetel sama sekali. Saya bertanya-tanya, apakah mungkin saya telah menyetel BUNDLE_FROZEN: 1 di tempat lain?
Bo G.

bundle config frozen falseadalah perbaikan goto saya. Terima kasih banyak, dua tahun berlalu! Saya yakin jawaban Joshua Pinter menjawab komentar di atas - bisa jadi konfigurasi Bundler global yang memengaruhi hal ini.
SRack

bundle config frozen falsetidak melakukan apa pun untukku. Menggunakan pengeditan .bundle / config di mana entri BUNDLE_FROZEN = "true" (tekstual benar)
Arthur

19

Hati-hati dengan konfigurasi Bundler global.

Saya memiliki konfigurasi global pada lingkungan dev ~/.bundle/configsaya yang tidak saya miliki di lingkungan CI / Produksi saya yang menyebabkan konfigurasi Gemfile.lockyang dibuat di lingkungan dev saya berbeda dari yang ada di lingkungan CI / Produksi saya.

Dalam kasus saya, saya disetel github.httpske true di lingkungan dev saya tetapi tidak memiliki konfigurasi seperti itu di lingkungan CI / Produksi saya. Hal ini menyebabkan kedua Gemfile.lockfile tersebut berbeda.


2
Terima kasih! dari semua jawaban sederhana yang berkeliaran terkait dengan kesalahan konyol ini --- inilah yang membuat saya kembali bekerja. Kenapa Heroku tidak otomatis membantu dengan ini? Sungguh alasan yang payah untuk kehilangan 3 jam terakhir dalam hidupku!
Hellion

2
Anda mungkin baru saja menyelamatkan hidup saya. Saya bersiap-siap untuk menembak diri sendiri karena ini: P
Tyrone Wilson

1
@JoshuaPinter, ya ini menyelamatkan saya! meskipun dengan menghabiskan beberapa jam untuk itu ... tetapi saya mencoba untuk memperbaiki peringatan yang saya dapatkan ketika melakukan 'pemasangan bundel' dan terjebak dalam acar ini. Sangat dihargai!
daveomcd

1
@daveomcd Berada di sana, senang itu menyelamatkan Anda beberapa jam dari menggaruk-garuk kepala. :)
Joshua Pinter

12

Ketika Anda melihat yang berikut ...

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

... Kemudian, masalahnya kemungkinan besar Anda memiliki file .gem yang kedaluwarsa di direktori vendor / cache Anda.

Mungkin, Anda sebelumnya menjalankan $bundle install --deploymentyang menyimpan beberapa file .gem "usang" di cache?

Bagaimanapun, Anda dapat melewati kesalahan ini dengan menjalankan: bundle install --no-deployment

Itulah salah satu dari banyak hal hebat tentang Rails ... pesan kesalahan sering kali memberi tahu Anda apa yang harus dilakukan untuk memperbaiki masalah.


7

Masalah khusus saya terkait dengan apa yang dilaporkan oleh @JoshPinter, yaitu perbedaan host dev-vs-deploy dalam protokol yang digunakan oleh bundler untuk mengambil permata dari github.

Singkatnya, yang harus saya lakukan hanyalah memodifikasi Gemfileentri berikut ...

gem 'activeadmin', github: 'activeadmin'

... untuk sintaks aman ini ( lihat referensi ):

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

Dan penerapan saya kembali normal.


Ini juga memperbaiki masalah saya. Sangat aneh.
Joshua Muheim

6

Solusi bagi saya sedikit berbeda dari yang lain yang tercantum di sini. Saya mencoba meningkatkan dari sidekiq ke sidekiq-pro (yang membutuhkan bundler 1.7.12+), tetapi saya terus mendapatkan pesan "Anda mencoba menginstal dalam mode penerapan setelah mengubah Gemfile Anda" dari travis-ci

Memeriksa output konsol dari travis-ci mengungkapkan bahwa versi bundler yang lebih lama sedang digunakan.

Dalam kasus saya, saya harus mengedit file travis.yml untuk menambahkan:

before_install: - gem update bundler

Ini memaksa travis-ci untuk menggunakan versi bundler terbaru, dan membuat pesan kesalahan hilang.


Ini berhasil bagi saya di bawah Capistrano untuk menjalankan cap shelldan gem update bundleratau with <role> gem update bundleratauon <machine> gem update bundler
Eric

4

Saya tidak peduli. Inilah yang saya lakukan. Itu memperbaikinya.

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


2

Penyebab kesalahan lainnya:

Ini agak bodoh, tapi saya yakin orang lain akan melakukan kesalahan yang sama.

Untuk Rails 4, Heroku menambahkan permata rails_12factor. Jika Anda menggunakannya sebelum mereka menambahkannya, maka Anda akan memiliki dua permata ini:

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

Anda harus menghapusnya saat menambahkan yang baru. (mereka termasuk). Saya pikir Anda bisa lolos sampai Anda menyentuhnya di file permata Anda, kemudian Heroku memperhatikan duplikasi dan berteriak dengan kesalahan di atas.

semoga berhasil dengan Rails 4.


1

Saya mengalami hal serupa sebelumnya. Salah satu cara untuk memperbaikinya, saya pikir, tetapi mungkin memakan lebih banyak ruang di server Anda daripada yang Anda inginkan, adalah dengan menjalankannya

bundle install --deployment 

lalu coba terapkan. Ini melakukan sesuatu seperti menginstal semua permata Anda ke dalam folder vendor, yang menurut saya secara umum baik untuk dihindari ... tetapi mungkin masih akan berfungsi. Aplikasi saya dulu berperilaku seperti ini, solusi saya adalah menghapus versi yang tepat untuk diunduh dari dalam Gemfile saya, lalu menggulung ulang dan menerapkan.

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

untuk

gem 'rails_admin'

Atau Anda dapat melakukan apa yang disarankan, dan Git proyek Anda dari server produksi ke mesin lokal, menggabungkannya, dan kemudian memasukkannya kembali ke server Anda. Solusi ini mungkin tidak 100% benar tetapi beberapa di antaranya berhasil untuk saya ... hanya berpikir saya akan berbagi. Semoga berhasil


1
The --deploymentbendera tidak membuat perbedaan kecuali aku menghapus Gemfile.lock. Apakah seharusnya seperti itu?
JellicleCat

1

Dalam kasus kami, kami menggunakan fitur yang tidak tersedia di versi lama bundler yang berjalan di mesin produksi kami. Oleh karena itu cukup mengupgrade bundler, yaitu do a gem update bundler.


Terima kasih - Saya juga mengalami masalah ini. Ternyata versi bundler di server lebih tua dari yang kami gunakan di desktop kami.
Nathan Bertram

1

Ini mungkin ide yang berbahaya, tetapi jika benar-benar harus menguji sesuatu di lingkungan penerapan produksi, Anda dapat mengedit file .bundle / config

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

Sekarang panggil bundel, dalam kasus saya, saya perlu memperbarui permata tertentu, jadi ini perintah saya

RAILS_ENV=production bundle update <whatever gem>

Anda mungkin harus mengubahnya kembali setelah pembaruan, sehingga semuanya berfungsi seperti yang Anda harapkan, setelahnya. Sekali lagi, ini mungkin tidak didukung, dan YMMV


0

Saya mengalami ini saat menerapkan aplikasi Nesta setelah beberapa pembaruan permata. Apa yang berhasil bagi saya adalah menghapus Gemfile.lock , menjalankannya bundle installuntuk membuatnya kembali, dan menerapkannya lagi.


0

Aku berlari ke dalam masalah yang sama namun aku baik bundle installdan bundle updatedan Heroku masih menolak dorongan saya.

Saya memperbaiki masalah ini hanya dengan menghapus Gemfile.lock dan menjalankannya bundle installkembali. Saya kemudian menambahkan, berkomitmen, dan mendorongnya ke git repo saya. Setelah itu saya tidak mengalami masalah untuk mendorong ke Heroku.


Kecuali jika Anda telah memperbaiki versi permata di file permata Anda, ini berisiko .. ini mungkin memperbarui permata dan merusak aplikasi Anda
Abram

0

untuk heroku, Anda tidak perlu mengubah sintaks di file Gemfile. Anda bisa menambahkan BUNDLE_GITHUB__HTTPS(perhatikan garis bawah ganda) sebagai variabel lingkungan dan setel ke true(di dasbor aplikasi heroku Anda di bawah Settingstab di Config Varsbagian). ini akan mengalihkan protokol dari git://menjadi https://untuk semua permintaan semacam itu.


0

Saya mendapat pesan kesalahan saat mencoba mengirim ke Heroku. Saya menemukan solusi berikut diperbaiki.

  1. Master asal Git pull
  2. Status Git
  3. Git commit
  4. Master asal Git push
  5. Git mendorong master heroku

0

Masalah ini dapat terkait dengan submodul yang menunjuk ke kode versi lama. Bagi saya, saya menyelesaikan masalah ini dengan memperbarui submodul saya

Jika Anda memiliki submodul, coba jalankan:

git submodule update --init

bundle install


0

Setelah perintah ini, Anda dapat melakukan penginstalan bundel normal Anda lagi:

bundle install --no-deployment

0

Saya membaca selusin solusi tentang sumber daya yang berbeda tetapi tidak menemukan secara tepat apa yang dapat membantu saya dalam situasi ini

Jadi saya menemukan solusi. Tepatnya mengatakan saya membaca pesan kesalahan dengan penuh perhatian dan ada solusi: Jalankan pemasangan bundel di tempat lain . "Di tempat lain" adalah Cloud9 saya tempat saya mengembangkan aplikasi. Jadi langkah saya

  1. salin Gemfile dan Gemfile.lock dari server ke mesin lokal dengan rsyncperintah
  2. masukkan dua file ini ke dalam proyek RoR saya (saya menggunakan Cloud9)
  3. buka Gemfile dan buat perubahan yang saya inginkan. Dalam kasus saya, saya menambahkan permata 'tipis'
  4. di cd terminal ke aplikasi saya di Cloud9 dan jalankan bundle install. dalam hal ini Anda akan memiliki versi Gemfile.lock yang telah diubah
  5. menyalin baru Gemfile dan Gemfile.lock pada server menggunakanrsync
  6. cd ke folder aplikasi saya dan jalankan lagi bundle install --deployment --without development test SELESAI! Semoga beruntung untuk semua!
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.