我有一个奇怪的用例,我需要在另一个没有 Gemfile.lock 的新制作的 Rails 应用程序上从 Rails 应用程序发出“捆绑安装”(作为 system() 命令) 。
我知道这通常是从命令行完成的,但我需要在 Rails 中完成。
作为参考,这很容易通过 irb 实现。它按预期根据 Gemfile 获取 gem 并生成 Gemfile.lock。
出于某种原因,当我在 Rails 控制台(从另一个应用程序)中发出相同系列的命令时,bundle 命令实际上并没有获取或更新 gem,也没有生成 Gemfile.lock。
正如 tadman 指出的那样,我相信这是由于 和 之间的环境变化irb
所致rails console
。该bundle install
命令在从 system() 执行时,作用于启动 Rails 控制台的 Rails 应用程序,而不是目标应用程序。
即使尝试ENV
将 Rails 控制台中的变量与中的变量匹配,irb
我仍然无法弄清楚(请参阅下面的尝试)。
测试这个的步骤:
cd && rails new myapp --skip-bundle
- 从另一个/完整的 Rails 应用程序启动
rails console
Dir.chdir("/home/user/myapp")
system("bundle install")
- 这实际上不会获取 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.
编辑 1:经过 tadman 的考虑,我尝试了这个,它引发了一个奇怪的捆绑错误:
[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`
谢谢!