从Rails控制台系统命令发出时,“bundle install”不会创建Gemfile.lock

时间:2013-06-28 04:47:12

标签: ruby-on-rails ruby bundler irb

我有一个奇怪的用例,我需要从另一个新建的Rails应用程序上的Rails应用程序上发出“bundle install”(作为system()命令),而不需要Gemfile.lock

我知道这通常是从命令行完成的,但我需要在Rails中完成。

作为参考,irb可以轻松实现这一点。它按预期基于Gemfile获取gem,并生成Gemfile.lock。

出于某种原因,当我在Rails控制台(来自另一个应用程序)并且我发出相同系列的命令时,bundle命令实际上不会获取或更新gem并且不会生成Gemfile.lock。

正如塔德曼指出的那样,我认为这是由于irbrails console之间环境的变化。从system()执行时,bundle install命令作用于启动Rails控制台而不是目标应用程序的Rails应用程序。

即使尝试将Rails控制台中的ENV变量与irb中的变量匹配,我仍然无法弄清楚(参见下面的尝试)。

测试此步骤的步骤:

  1. cd && rails new myapp --skip-bundle
  2. 来自另一个/完整的Rails应用启动rails console
  3. Dir.chdir("/home/user/myapp")
  4. system("bundle install")
  5. 这实际上不会在myapp中获取宝石,也不会创建Gemfile.lock
  6. 使用 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`
    

    谢谢!

2 个答案:

答案 0 :(得分:8)

解决:

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

对于#bundler,所有功劳归于#bundler上的irc用户间接

答案 1 :(得分:0)

在我的案例中使用Bundler.with_clean_env {Dir.chdir" / path / to / myapp" {bundle install}}

请注意相同但没有"("和")"