"bundle install" not creating Gemfile.lock when issued from a Rails console system command
Asked Answered
B

2

7

I have an odd use-case where I need to issue "bundle install" (as a system() command) from a Rails application on another freshly-made Rails application without a Gemfile.lock.

I'm aware that this is usually done from the command line but I need to do it within Rails.

As a point of reference, this is easily achievable with irb. It fetches the gems based on the Gemfile as expected and generates a Gemfile.lock.

For some reason, when I am in a Rails console (from another app) and I issue the same series of commands, the bundle command does not actually fetch or update the gems and does not generate the Gemfile.lock.

As tadman pointed out, I believe this is due to the environment changing between irb and rails console. The bundle install command, when executed from system(), is acting on the Rails app that launched the Rails console instead of the target application.

Even when trying to match ENV variables in the Rails console to the ones in irb I still cannot figure it out (see attempts below).

Steps to test this:

  1. cd && rails new myapp --skip-bundle
  2. From another/full Rails app launch rails console
  3. Dir.chdir("/home/user/myapp")
  4. system("bundle install")
  5. This will not actually fetch the gems in myapp and it will not create Gemfile.lock

With irb (successful):

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.

With rails console (unsuccessful):

[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: After tadman's consideration, I've tried this which throws a strange bundle error:

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

And:

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

Thank you!

Baucom answered 28/6, 2013 at 4:47 Comment(6)
Why are you launching irb and then running shell commands instead of just running shell commands directly?Folkmoot
@Folkmoot Since I need to eventually issue the shell command from the Rails app, I was testing it in irb and highlighting the difference between it and a Rails console here.Baucom
I think modifying Gemfile.lock within Rails, after that file has already been loaded, sounds like a really bad idea. That being said, you're probably seeing differences in your environment that are confusing bundler. You could change your command to env > env.txt and compare the two results.Folkmoot
@Folkmoot Thanks. I am not modifying the Gemfile.lock of the app that I'm launching the Rails console from. It's a different app that I'm running bundle install on. After testing, the envs are different.Baucom
Yup, the Rails console has BUNDLE_GEMFILE defined which is probably overriding bundle's and prohibiting from updating/generating.Baucom
@Folkmoot I've updated with my attempt at clearing the environment.Baucom
B
9

Solved with:

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

All credit goes to irc user indirect on #bundler for this.

Baucom answered 28/6, 2013 at 20:30 Comment(0)
T
0

in my case work with Bundler.with_clean_env { Dir.chdir "/path/to/myapp" { bundle install } }

note that is the same but without "(" and ")"

Teat answered 2/4, 2015 at 20:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.