Bundler: Bạn đang cố gắng cài đặt ở chế độ triển khai sau khi thay đổi Gemfile của mình


86

Tôi khá mới đối với Bundler và capistrano, và tôi đang cố gắng sử dụng chúng cùng nhau. Khi tôi cố gắng triển khai, tôi nhận được thông báo:

Bạn đang cố gắng cài đặt ở chế độ triển khai sau khi thay đổi Gemfile của mình. Chạy `` cài đặt gói '' ở nơi khác và thêm Gemfile.lock đã cập nhật vào kiểm soát phiên bản.

Tôi không biết làm thế nào để đáp ứng hệ thống đang phàn nàn và tôi không hiểu tại sao khiếu nại lại xuất hiện vì tôi đã đọc trong tài liệu :

Nếu một Gemfile.lock tồn tại và bạn đã cập nhật Gemfile (5) của mình, thì Bundler sẽ sử dụng các phụ thuộc trong Gemfile.lock cho tất cả các đá quý mà bạn chưa cập nhật, nhưng sẽ giải quyết lại các phụ thuộc của các đá quý mà bạn đã cập nhật . Bạn có thể tìm thêm thông tin về quá trình cập nhật này bên dưới trong CẬP NHẬT BẢO TỒN.

Tôi giải thích điều đó có nghĩa là Bundler có thể xử lý thực tế rằng Gemfile của tôi không phải là bất cứ thứ gì nó mong đợi. Bất kỳ giúp đỡ?

Thông số kỹ thuật: Ruby 1.9.3, Rails 3.2.3, Capistrano 2.12.0, Bundler 1.1.4, Windows 7, triển khai cho máy Posix.

Chỉnh sửa: Gemfile của tôi bao gồm các khối logic như sau:

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

Câu trả lời:


80

Thông báo lỗi bạn nhận được Gemfile.lockcó thể là do bạn GemfileGemfile.lockbạn không đồng ý với nhau. Có vẻ như bạn đã thay đổi một cái gì đó trong Gemfile của mình kể từ lần cuối cùng bạn chạy bundle install(hoặc update). Khi bạn bundle install, nó cập nhật Gemfile.lock của bạn với bất kỳ thay đổi nào bạn đã thực hiện đối với Gemfile.

Đảm bảo rằng bạn chạy bundle installcục bộ và đăng ký để kiểm soát nguồn mới được cập nhật Gemfile.locksau đó. Sau đó, hãy thử triển khai.

Chỉnh sửa : Như được công nhận trong các nhận xét, một điều kiện trong Gemfile dẫn đến một Gemfile.lock hợp lệ trên một nền tảng, không hợp lệ trên một nền tảng khác. Cung cấp cờ nền tảng cho các đá quý phụ thuộc vào nền tảng này trong Gemfile sẽ giải quyết được sự bất đối xứng.


2
Nghe có vẻ như câu trả lời đúng, nhưng tôi đã chạy cài đặt gói trên máy dev của mình, sau đó kiểm tra cả Gemfile và khóa của nó vào svn, sau đó sử dụng capistrano. Vấn đề có thể là do Gemfile bao gồm một khối với unless RbConfig::CONFIG['host_os'] === 'mingw32':? (Ergo nó nên nhóm nhiều mặt hàng khác nhau trên máy tính của cửa sổ của tôi hơn trên máy chủ Linux.)
JellicleCat

1
Hoàn toàn có thể. Kiểm tra nội dung của Gemfile.lock của bạn - nó có chứa (các) gem tham chiếu chỉ nên có trên Windows không? Nếu vậy, điều đó cho thấy rằng trên máy triển khai, Gemfile và Gemfile.lock khác nhau. (Ngoài ra, tôi không phải là chuyên gia về Bundler, nhưng tôi khá chắc chắn rằng việc đưa các điều kiện vào Gemfile của bạn không phải là phương pháp hay nhất. Hãy xem xét sử dụng nhóm hoặc : cờ nền tảng ).
Edd Morgan,

2
Việc sử dụng :platformscờ cho các viên ngọc mà máy chủ prod (posix) của tôi cần nhưng không có trên máy chủ dev (win) của tôi đã tạo ra sự khác biệt: platforms :ruby do; gem 'mygem'; ...; end(Bạn nhận được dấu kiểm màu xanh lá cây nếu bạn không ngại thêm hướng dẫn này vào câu trả lời của mình.)
JellicleCat

: nền tảng không có khả năng phân biệt giữa Linux và / hoặc darwin env sử dụng :require, hoạt động tốt quá stackoverflow.com/a/16475580/933358
Daniel W. Crompton

Điều này đã làm việc cho tôi! Cảm ơn bạn, đã cứu tôi khỏi nhiều ngày thất vọng!
thenextmogul

26

vi .bundle / config

thay đổi tùy chọn BUNDLE_FROZEN từ '1' thành '0'

thực hiện "cài đặt gói"


HOẶC LÀ

chạy "cấu hình gói"

xem giá trị "cố định" có đúng không, hãy đặt nó thành false

bó cấu hình bị đóng băng sai


Đây là những gì đã làm nó cho tôi. Điều thú vị là trong chính tệp cấu hình, khóa BUNDLE_FROZEN hoàn toàn không được đặt. Tôi tự hỏi, có thể nào tôi đã đặt BUNDLE_FROZEN: 1 ở nơi khác không?
Bo G.

bundle config frozen falselà sửa chữa goto của tôi. Cảm ơn rất nhiều, hai năm sau! Tôi tin rằng câu trả lời của Joshua Pinter giải quyết được nhận xét ở trên - đó có thể là cấu hình Bundler toàn cầu ảnh hưởng đến điều này.
SRack

bundle config frozen falsekhông làm gì cho tôi. Đã nhờ đến việc chỉnh sửa .bundle / config trong đó mục nhập BUNDLE_FROZEN = "true" (đúng văn bản)
Arthur

19

Chú ý đến cấu hình Bundler chung.

Tôi đã có cấu hình toàn cục trên môi trường nhà phát triển của mình ~/.bundle/configmà tôi không có trong môi trường CI / Sản xuất của mình khiến cấu hình Gemfile.lockđược tạo trong môi trường nhà phát triển của tôi khác với cấu hình trong môi trường CI / Sản xuất của tôi.

Trong trường hợp của tôi, tôi đã đặt github.httpsthành true trong môi trường dev của mình nhưng không có cấu hình như vậy trong môi trường CI / Production của mình. Điều này làm cho hai Gemfile.locktệp khác nhau.


2
cảm ơn! trong số tất cả các câu trả lời đơn giản liên quan đến lỗi vô lý này --- đây là điều khiến tôi trở lại làm việc. Tại sao Heroku không tự động hỗ trợ việc này? Thật là một lý do khập khiễng khi mất 3 giờ cuối cùng của cuộc đời mình!
hellion

2
Bạn có thể vừa cứu mạng tôi. Tôi đã chuẩn bị sẵn sàng để bắn bản thân mình hơn này: P
Tyrone Wilson

1
@JoshuaPinter, vâng điều này đã cứu tôi! mặc dù đã dành vài giờ cho nó ... nhưng tôi đã cố gắng sửa các cảnh báo mà tôi nhận được khi thực hiện 'cài đặt gói' và bị mắc kẹt trong vấn đề này. Nhiều đánh giá cao!
daveomcd

1
@daveomcd Bạn đã đến đó, rất vui vì nó đã giúp bạn tiết kiệm được vài giờ vò đầu bứt tai. :)
Joshua Pinter

11

Khi bạn thấy những điều sau ...

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

... Sau đó, vấn đề rất có thể là bạn có các tệp .gem đã lỗi thời trong thư mục bộ nhớ cache / nhà cung cấp của bạn.

Có lẽ, bạn đã chạy trước đó đã $bundle install --deploymentđặt một số tệp .gem "lỗi thời" vào bộ nhớ cache?

Trong mọi trường hợp, bạn có thể vượt qua lỗi này bằng cách chạy: bundle install --no-deployment

Đó là một trong nhiều điều tuyệt vời về Rails ... các thông báo lỗi thường cho bạn biết chính xác phải làm gì để khắc phục sự cố.


7

Vấn đề cụ thể của tôi liên quan đến những gì được báo cáo bởi @JoshPinter, tức là sự khác biệt giữa máy chủ giữa dev-vs-deploy trong giao thức được Bundler sử dụng để truy xuất đá quý từ github.

Để làm cho một câu chuyện dài trở nên ngắn gọn, tất cả những gì tôi phải sửa đổi Gemfilemục nhập sau đây ...

gem 'activeadmin', github: 'activeadmin'

... với cú pháp an toàn này ( xem phần tham khảo ):

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

Và quá trình triển khai của tôi đã trở lại bình thường.


Điều này cũng đã khắc phục sự cố cho tôi. Rất lạ.
Joshua Muheim

6

Giải pháp cho tôi hơi khác so với những giải pháp khác được liệt kê ở đây. Tôi đã cố gắng nâng cấp từ sidekiq lên sidekiq-pro (yêu cầu Bundler 1.7.12+), nhưng tôi vẫn nhận được thông báo "Bạn đang cố gắng cài đặt ở chế độ triển khai sau khi thay đổi Gemfile của bạn" từ travis-ci

Kiểm tra đầu ra bảng điều khiển của travis-ci cho thấy rằng một phiên bản cũ hơn của Bundler đang được sử dụng.

Trong trường hợp của tôi, tôi phải chỉnh sửa tệp travis.yml để thêm:

before_install: - gem update bundler

Điều này buộc travis-ci phải sử dụng phiên bản mới nhất của Bundler và làm cho thông báo lỗi biến mất.


Điều này làm việc cho tôi theo Capistrano để chạy cap shellgem update bundlerhay with <role> gem update bundlerhayon <machine> gem update bundler
Eric

4

Tôi không quan tâm. Đây là những gì tôi đã làm. Nó đã sửa nó.

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


1

Tôi đã gặp phải một cái gì đó tương tự trước đây. Tôi nghĩ rằng một cách để khắc phục nó, nhưng có thể chiếm nhiều dung lượng trên máy chủ của bạn hơn bạn muốn, là chạy

bundle install --deployment 

và sau đó cố gắng triển khai. Điều này thực hiện một cái gì đó giống như cài đặt tất cả đá quý của bạn vào thư mục của nhà cung cấp, điều mà tôi tin rằng nói chung là tốt để tránh ... nhưng vẫn có thể hoạt động. Ứng dụng của tôi đã từng hoạt động như vậy, giải pháp của tôi là xóa các phiên bản chính xác để tải xuống từ Gemfile của tôi, sau đó hoàn lại và triển khai.

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

đến

gem 'rails_admin'

Hoặc bạn có thể làm những gì nó gợi ý và Git dự án của bạn khỏi máy chủ sản xuất vào một máy cục bộ, gói nó và sau đó đưa lại vào máy chủ của bạn. Giải pháp này có thể không đúng 100% nhưng một số giải pháp đã hiệu quả với tôi ... tôi chỉ nghĩ rằng tôi sẽ chia sẻ. Chúc may mắn


1
Các --deploymentcờ không tạo sự khác biệt, trừ khi tôi xóa Gemfile.lock. Đó có phải là cách nó được cho là?
JellicleCat

1

Một nguyên nhân khác của lỗi:

Điều này hơi ngu ngốc, nhưng tôi chắc chắn ai đó cũng sẽ mắc phải sai lầm tương tự.

Đối với Rails 4, Heroku đã thêm gem rails_12factor. Nếu bạn đã sử dụng nó trước khi họ thêm nó, thì bạn sẽ có hai viên ngọc sau:

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

Bạn phải xóa chúng khi thêm cái mới. (chúng được bao gồm). Tôi nghĩ bạn có thể thoát khỏi nó cho đến khi bạn chạm vào chúng các dòng trong tệp đá quý của mình, sau đó Heroku nhận thấy sự trùng lặp và kêu lên với lỗi trên.

chúc may mắn với Rails 4.


1

Trong trường hợp của chúng tôi, chúng tôi đang sử dụng một tính năng không có trong phiên bản cũ của gói dịch vụ chạy trên máy sản xuất của chúng tôi. Do đó, nó là đủ để nâng cấp gói, tức là làm một gem update bundler.


Cảm ơn - tôi cũng gặp sự cố này. Hóa ra phiên bản của gói gộp trên máy chủ cũ hơn phiên bản chúng tôi đang sử dụng trên máy tính để bàn của mình.
Nathan Bertram

1

Đây có thể là một ý tưởng nguy hiểm, nhưng nếu nhất thiết phải kiểm tra điều gì đó trong môi trường triển khai sản xuất, bạn có thể chỉnh sửa tệp .bundle / config

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

Bây giờ gọi gói, trong trường hợp của tôi, tôi cần cập nhật một viên ngọc cụ thể, vì vậy đây là lệnh của tôi

RAILS_ENV=production bundle update <whatever gem>

Bạn có thể nên thay đổi nó trở lại sau khi cập nhật, để mọi thứ hoạt động như bạn mong đợi, sau đó. Một lần nữa, điều này có thể không được hỗ trợ và YMMV


0

Tôi gặp phải vấn đề này khi triển khai ứng dụng Nesta sau một số bản cập nhật đá quý. Điều phù hợp với tôi là xóa Gemfile.lock , chạy bundle installđể tạo lại nó và triển khai lại.


0

Tôi chạy vào một vấn đề tương tự tuy nhiên tôi đã làm tất cả bundle installbundle updatevà Heroku vẫn từ chối đẩy tôi.

Tôi đã khắc phục sự cố bằng cách chỉ xóa Gemfile.lock và sau đó chạy bundle installlại. Sau đó, tôi đã thêm, cam kết và đẩy điều đó vào git repo của mình. Sau đó tôi không gặp vấn đề gì khi đẩy đến Heroku.


Trừ khi bạn đã sửa các phiên bản đá quý trong tệp gem của mình, điều này rất rủi ro .. nó có thể cập nhật đá quý và phá vỡ ứng dụng của bạn
Abram

0

đối với heroku, bạn không cần phải thay đổi cú pháp trong Gemfile. bạn chỉ có thể thêm BUNDLE_GITHUB__HTTPS(lưu ý dấu gạch dưới kép) làm biến môi trường và đặt nó thành true(trong bảng điều khiển ứng dụng heroku của bạn dưới Settingstab trong Config Varsphần). điều này sẽ chuyển giao thức từ git://sang https://cho tất cả các yêu cầu như vậy.


0

Tôi đã gặp thông báo lỗi khi cố gắng đẩy lên Heroku. Tôi tìm thấy giải pháp sau đã được sửa.

  1. Git pull origin master
  2. Trạng thái Git
  3. Git cam kết
  4. Git push origin master
  5. Git push heroku master

0

Vấn đề này có thể liên quan đến các mô-đun con trỏ đến các phiên bản mã cũ. Đối với tôi, tôi đã giải quyết vấn đề này bằng cách cập nhật các mô-đun con của mình

Nếu bạn có mô-đun con, hãy thử chạy:

git submodule update --init

bundle install


0

Sau lệnh này, bạn có thể thực hiện lại cài đặt gói bình thường của mình:

bundle install --no-deployment

0

Tôi đã đọc hàng tá giải pháp trên các nguồn khác nhau nhưng không tìm thấy chính xác điều gì có thể giúp tôi trong tình huống này

Vì vậy, tôi đã tìm ra một giải pháp. Nói chính xác là tôi đã chăm chú đọc thông báo lỗi và có một cảnh báo: Chạy cài đặt gói ở nơi khác . "Nơi khác" là Cloud9 của tôi, nơi tôi đã phát triển ứng dụng của mình. Vì vậy, các bước của tôi

  1. sao chép Gemfile và Gemfile.lock từ máy chủ sang máy cục bộ bằng rsynclệnh
  2. chèn hai tệp này vào dự án RoR của tôi (tôi đã sử dụng Cloud9)
  3. mở Gemfile và thực hiện các thay đổi mà tôi muốn. Trong trường hợp của tôi, tôi đã thêm đá quý 'thin'
  4. trong terminal cd vào ứng dụng của tôi trên Cloud9 và chạy bundle install. trong trường hợp này, bạn sẽ có một phiên bản thay đổi của Gemfile.lock
  5. sao chép mới Gemfile và Gemfile.lock trên máy chủ sử dụngrsync
  6. cd vào thư mục ứng dụng của tôi và chạy lại bundle install --deployment --without development test DONE! Chúc may mắn cho tất cả!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.