2013-06-28 4 views
5

Ich habe einen seltsamen Anwendungsfall, in dem ich "Bundle-Installation" (als System() -Befehl) aus einer Rails-Anwendung ausführen muss eine weitere frisch gefertigte Rails-Anwendung ohne Gemfile.lock."Bundle-Installation" erstellt Gemfile.lock nicht, wenn es von einem Rails-Konsolensystembefehl ausgegeben wird

Ich bin mir bewusst, dass dies normalerweise von der Befehlszeile aus getan wird, aber ich muss es in Rails tun.

Als Bezugspunkt ist dies leicht mit irb erreichbar. Er ruft die Edelsteine ​​basierend auf dem Gemfile wie erwartet ab und erzeugt einen Gemfile.lock.

Aus irgendeinem Grund, wenn ich in einer Rails-Konsole bin (aus einer anderen App) und ich die gleiche Reihe von Befehlen ausgeben, holt der Bundle-Befehl nicht wirklich die Edelsteine ​​und aktualisiert die Gemfile.lock nicht.

Wie tadman darauf hingewiesen hat, glaube ich, dass dies aufgrund der sich ändernden Umwelt zwischen irb und rails console ist. Der Befehl bundle install wirkt bei Ausführung von system() auf der Rails-App, die die Rails-Konsole anstelle der Zielanwendung gestartet hat.

Selbst wenn ich versuche, ENV Variablen in der Rails-Konsole mit denen in irb zu vergleichen, kann ich es immer noch nicht herausfinden (siehe Versuche unten).

Schritte dies zu testen:

  1. cd && rails new myapp --skip-bundle
  2. aus einem anderen/full Rails app starten rails console
  3. Dir.chdir("/home/user/myapp")
  4. system("bundle install")
  5. Dies wird nicht wirklich holen die Edelsteine ​​in myapp und es wird nicht erstellen Gemfile.lock

Mit irb (erfolgreich):

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. 

Mit Schienen Konsole (erfolglos):

[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: Nach Tadman der Überlegung habe ich schon versucht, diese, die werfen ein merkwürdiger Bündelfehler:

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

Und:

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

Vielen Dank!

+0

Warum Sie starten 'irb' und dann Shell-Befehle ausführen, anstatt nur laufen Shell-Befehle direkt? – tadman

+0

@tadman Da ich schließlich den Shell-Befehl aus der Rails-App ausgeben muss, habe ich es in 'irb' getestet und den Unterschied zwischen dieser und einer Rails-Konsole hier hervorgehoben. –

+0

Ich denke, 'Gemfile.lock' in Rails zu modifizieren, nachdem die Datei bereits geladen wurde, klingt wie eine wirklich schlechte Idee. Davon abgesehen sehen Sie wahrscheinlich Unterschiede in Ihrer Umgebung, die 'Bundler' verwirren. Sie könnten Ihren Befehl in 'env> env.txt' ändern und die beiden Ergebnisse vergleichen. – tadman

Antwort

6

mit Gelöst:

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

Alle Kredit indirekte auf #bundler für diese irc Benutzer geht.

+0

Ich würde dir 100 upvotes geben, wenn ich könnte. –

0

in meinem Fall arbeiten mit Bundler.with_clean_env {Dir.chdir "/ path/to/myapp" {bundle install}}

beachten Sie, dass das gleiche ist, aber ohne "(" und ")"

Verwandte Themen