2013-06-28 20 views
5

Tôi có trường hợp sử dụng lẻ mà tôi cần phát hành "gói cài đặt" (dưới dạng lệnh system()) từ ứng dụng Rails trên một ứng dụng Rails mới được tạo khác mà không có Gemfile.lock."gói cài đặt" không tạo Gemfile.lock khi được phát hành từ lệnh hệ thống giao diện điều khiển Rails

Tôi biết rằng điều này thường được thực hiện từ dòng lệnh nhưng tôi cần thực hiện trong Rails.

Là một điểm tham chiếu, điều này có thể dễ dàng đạt được với irb. Nó lấy các gem dựa trên Gemfile như mong đợi và tạo ra một Gemfile.lock. Vì lý do nào đó, khi tôi đang ở trong một bảng điều khiển Rails (từ một ứng dụng khác) và tôi phát hành cùng một loạt lệnh, lệnh bó không thực sự tìm nạp hoặc cập nhật đá quý và không tạo Gemfile.lock.

Như tadman đã chỉ ra, tôi tin rằng điều này là do môi trường thay đổi giữa irbrails console. Lệnh bundle install, khi được thực hiện từ system(), đang hoạt động trên ứng dụng Rails đã khởi chạy bảng điều khiển Rails thay vì ứng dụng đích.

Ngay cả khi cố gắng đối sánh các biến số ENV trong bảng điều khiển Rails với số trong irb Tôi vẫn không thể tìm ra (xem các nỗ lực bên dưới).

bước để kiểm tra điều này:

  1. cd && rails new myapp --skip-bundle
  2. Từ một/full Rails ứng dụng ra mắt rails console
  3. Dir.chdir("/home/user/myapp")
  4. system("bundle install")
  5. này sẽ không thực sự lấy viên ngọc trong myapp và nó sẽ không tạo Gemfile.lock

Với IRB (thành công):

1.9.3p429 :002 > Dir.chdir("/home/user/myapp") 
=> 0 
1.9.3p429 :003 > system("bundle install") 
Updating git://github.com/plataformatec/devise.git 
Fetching gem metadata from https://rubygems.org/.......... 
Fetching gem metadata from https://rubygems.org/.. 
Resolving dependencies... 
Using rake (10.1.0) 
Using i18n (0.6.4) 
Using minitest (4.7.5) 
Using multi_json (1.7.7) 
Using atomic (1.1.10) 
Using thread_safe (0.1.0) 
Using tzinfo (0.3.37) 
Using activesupport (4.0.0.beta1) 
Using builder (3.1.4) 
Using erubis (2.7.0) 
Using rack (1.5.2) 
Using rack-test (0.6.2) 
Using actionpack (4.0.0.beta1) 
Using mime-types (1.23) 
Using polyglot (0.3.3) 
Using treetop (1.4.14) 
Using mail (2.5.4) 
Using actionmailer (4.0.0.beta1) 
Using activemodel (4.0.0.beta1) 
Using activerecord-deprecated_finders (0.0.3) 
Using arel (4.0.0) 
Using activerecord (4.0.0.beta1) 
Using bcrypt-ruby (3.0.1) 
Using bundler (1.3.5) 
Using coffee-script-source (1.6.2) 
Using execjs (1.4.0) 
Using coffee-script (2.2.0) 
Using json (1.8.0) 
Using rdoc (3.12.2) 
Using thor (0.18.1) 
Using railties (4.0.0.beta1) 
Using coffee-rails (4.0.0) 
Using orm_adapter (0.4.0) 
Using warden (1.2.1) 
Using devise (2.2.4) from git://github.com/plataformatec/devise.git (at rails4) 
Using google-analytics-rails (0.0.4) 
Using hike (1.2.3) 
Using jbuilder (1.0.2) 
Using jquery-rails (3.0.1) 
Using tilt (1.4.1) 
Using sprockets (2.10.0) 
Using sprockets-rails (2.0.0) 
Using rails (4.0.0.beta1) 
Using sass (3.2.9) 
Using sass-rails (4.0.0) 
Using sqlite3 (1.3.7) 
Using turbolinks (1.2.0) 
Using uglifier (2.1.1) 
Your bundle is complete! 
Use `bundle show [gemname]` to see where a bundled gem is installed. 

Với ray console (không thành công):

[1] pry(main)> Dir.chdir("/home/erik/facebook") 
=> 0 
[2] pry(main)> system("bundle install") 
Using rake (10.1.0) 
Using i18n (0.6.4) 
Using minitest (4.7.5) 
Using multi_json (1.7.7) 
Using atomic (1.1.10) 
Using thread_safe (0.1.0) 
Using tzinfo (0.3.37) 
Using activesupport (4.0.0.beta1) 
Using builder (3.1.4) 
Using erubis (2.7.0) 
Using rack (1.5.2) 
Using rack-test (0.6.2) 
Using actionpack (4.0.0.beta1) 
Using mime-types (1.23) 
Using polyglot (0.3.3) 
Using treetop (1.4.14) 
Using mail (2.5.4) 
Using actionmailer (4.0.0.beta1) 
Using activemodel (4.0.0.beta1) 
Using activerecord-deprecated_finders (0.0.3) 
Using arel (4.0.0) 
Using activerecord (4.0.0.beta1) 
Using addressable (2.3.5) 
Using annotate (2.5.0) 
Using json (1.8.0) 
Using mini_portile (0.5.0) 
Using nokogiri (1.6.0) 
Using uuidtools (2.1.4) 
Using aws-sdk (1.11.1) 
Using bcrypt-ruby (3.0.1) 
Using browser (0.1.6) 
Using xpath (2.0.0) 
Using capybara (2.1.0) 
Using ffi (1.9.0) 
Using childprocess (0.3.9) 
Using coderay (1.0.9) 
Using coffee-script-source (1.6.2) 
Using execjs (1.4.0) 
Using coffee-script (2.2.0) 
Using rdoc (3.12.2) 
Using thor (0.18.1) 
Using railties (4.0.0.beta1) 
Using coffee-rails (4.0.0) 
Using diff-lcs (1.2.4) 
Using gherkin (2.12.0) 
Using cucumber (1.3.2) 
Using cucumber-rails (1.3.0) 
Using curb (0.8.4) 
Using database_cleaner (1.0.1) 
Using orm_adapter (0.4.0) 
Using warden (1.2.1) 
Using devise (2.1.3) 
Using dotenv (0.8.0) 
Using eco-source (1.1.0.rc.1) 
Using eco (1.0.0) 
Using ejs (1.0.0) 
Using launchy (2.3.0) 
Using email_spec (1.4.0) 
Using factory_girl (4.2.0) 
Using factory_girl_rails (4.2.1) 
Using foreman (0.63.0) 
Using hike (1.2.3) 
Using jquery-rails (3.0.1) 
Using kgio (2.8.0) 
Using messengerjs-rails (1.3.3) 
Using method_source (0.8.1) 
Using pg (0.15.1) 
Using protected_attributes (1.0.2) 
Using slop (3.4.5) 
Using pry (0.9.12.2) 
Using pry-rails (0.3.1) 
Using bundler (1.3.5) 
Using tilt (1.4.1) 
Using sprockets (2.10.0) 
Using sprockets-rails (2.0.0) 
Using rails (4.0.0.beta1) 
Using rails-backbone (0.7.2) 
Using rails_serve_static_assets (0.0.1) 
Using rails_stdout_logging (0.0.1) 
Using rails_12factor (0.0.2) 
Using rails_on_heroku (0.0.2) 
Using raindrops (0.11.0) 
Using rspec-core (2.13.1) 
Using rspec-expectations (2.13.0) 
Using rspec-mocks (2.13.1) 
Using rspec (2.13.0) 
Using rspec-rails (2.13.2) 
Using rubyzip (0.9.9) 
Using sass (3.2.9) 
Using sass-rails (4.0.0) 
Using websocket (1.0.7) 
Using selenium-webdriver (2.33.0) 
Using shoulda-matchers (2.2.0) 
Using simplecov-html (0.7.1) 
Using simplecov (0.7.1) 
Using uglifier (2.1.1) 
Using unicorn (4.6.3) 
Using valid_email (0.0.4) 
Your bundle is complete! 
Use `bundle show [gemname]` to see where a bundled gem is installed. 

EDIT 1: Sau khi cân nhắc tadman, tôi đã cố gắng này mà ném một lỗi gói lạ:

[6] pry(main)> system({"BUNDLE_GEMFILE" => nil}, "bundle install") 
git://github.com/plataformatec/devise.git (at rails4) is not checked out. Please run `bundle install` 

Và:

[6] pry(main)> system({"BUNDLE_GEMFILE" => "/home/user/myapp/Gemfile"}, "bundle install") 
git://github.com/plataformatec/devise.git (at rails4) is not checked out. Please run `bundle install` 

Cảm ơn bạn!

+0

Tại sao các bạn tung ra 'irb' và sau đó chạy shell lệnh thay vì chỉ chạy lệnh shell trực tiếp? – tadman

+0

@tadman Vì tôi cần cuối cùng phát hành lệnh shell từ ứng dụng Rails, tôi đã thử nghiệm nó trong 'irb' và làm nổi bật sự khác biệt giữa nó và bảng điều khiển Rails ở đây. –

+0

Tôi nghĩ rằng sửa đổi 'Gemfile.lock' trong Rails, sau khi tập tin đó đã được tải, âm thanh như một ý tưởng thực sự xấu. Điều đó đang được nói, bạn có thể thấy sự khác biệt trong môi trường của bạn mà đang gây nhầm lẫn 'bundler'. Bạn có thể thay đổi lệnh của bạn thành 'env> env.txt' và so sánh hai kết quả. – tadman

Trả lời

6

giải quyết với:

Bundler.with_clean_env { Dir.chdir("/path/to/myapp") { `bundle install` } } 

Tất cả tín dụng đi vào sử dụng irc gián tiếp trên #bundler cho việc này.

+0

Tôi sẽ cung cấp cho bạn 100 upvotes nếu tôi có thể. –

0

trong trường hợp của tôi hoạt động với Bundler.with_clean_env {Dir.chdir "/ path/to/myapp" {bundle install}}

lưu ý rằng là như nhau nhưng không "(" và ")"

Các vấn đề liên quan