7

Gemfile.lock を使用せずに、新しく作成した別の Rails アプリケーションRails アプリケーションから "bundle install" (system() コマンドとして) を発行する必要がある奇妙なユースケースがあります。

これは通常コマンド ラインから実行されることは承知していますが、Rails 内で実行する必要があります。

参考までに、これは irb で簡単に達成できます。期待どおりに Gemfile に基づいて gem をフェッチし、Gemfile.lock を生成します。

何らかの理由で、(別のアプリから) Rails コンソールにいて、同じ一連のコマンドを発行すると、bundle コマンドは実際には gem を取得または更新せず、Gemfile.lock を生成しません。

tadman が指摘したように、これは と の間irbで環境が変化したためだと思いますrails console。このbundle installコマンドは、system() から実行されると、ターゲット アプリケーションではなく、Rails コンソールを起動した Rails アプリで動作します。

ENVRailsコンソールの変数をRailsコンソールの変数と一致させようとしても、irbまだわかりません(以下の試行を参照)。

これをテストする手順:

  1. cd && rails new myapp --skip-bundle
  2. 別の/完全なRailsアプリの起動からrails console
  3. Dir.chdir("/home/user/myapp")
  4. system("bundle install")
  5. これは実際には myapp の gem を取得せず、Gemfile.lock を作成しません。

irb を使用(成功):

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.

Rails コンソールの場合(失敗):

[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:タッドマンの検討の後、私はこれを試しましたが、これは奇妙なバンドルエラーをスローします:

[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`

と:

[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`

ありがとうございました!

4

2 に答える 2

0

私の場合は Bundler.with_clean_env { Dir.chdir "/path/to/myapp" { bundle install} }で作業します

同じですが、「(」と「)」がないことに注意してください

于 2015-04-02T20:57:23.430 に答える