5

Attualmente sto lavorando a un'applicazione Rails che funge da aggiornamento per un'altra applicazione Rails.Avviare un altro server Rails dall'app Rails con apici inversi

ho il lavoro processo di aggiornamento,

  • Scarica nuova release zip
  • estratto alla corretta posizione
  • Assets
  • Sync
  • bundle install
  • Assets precompilare server di
  • Inizia con - bundle exec rails server

Ho riscontrato un problema con l'ultimo passaggio.

quando ho eseguito:

Dir.chdir('../other-project') 
`bundle exec rails server -d -p 3000` 

dalla app di aggiornamento sembra essere tirando dalle updaters il paniere e non il nuovo bundle di applicazione che dovrebbe essere tirando da.

Il programma di aggiornamento è scritto in Rails 4 e l'applicazione è l'aggiornamento è rotaie 3.

Quando provo ad avviare il server ottengo il seguente:

/home/vagrant/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/railties-4.1.4/lib/rails/railtie/configuration.rb:95:in `method_missing': undefined method `handlebars' for #<Rails::Application::Configuration:0x007f9de18de100> (NoMethodError) 
    from /home/vagrant/apps/other-project/config/application.rb:22:in `<class:Application>' 
    from /home/vagrant/apps/other-project>' 
    from /home/vagrant/apps/other-project/config/application.rb:13:in `<top (required)>' 
    from /home/vagrant/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:79:in `require' 
    from /home/vagrant/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:79:in `block in server' 
    from /home/vagrant/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:76:in `tap' 
    from /home/vagrant/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:76:in `server' 
    from /home/vagrant/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:40:in `run_command!' 
    from /home/vagrant/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/railties-4.1.4/lib/rails/commands.rb:17:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

Da questa uscita posso dire che sta provando a utilizzare la versione errata di railties ...

Quando eseguo il comando manualmente cd ../other-project e bundle exec rails server -d -p 3000, funziona correttamente.

Ci sono trucchi di base che posso usare per aggirare questo problema? La scatola base è Ubuntu 14.04

Grazie!

+0

Perché utilizzare un'intera applicazione di binari per questa attività procedurale? Avresti potuto farlo con uno script bash – kendotwill

+0

@kendotwill Lo scopo di questa app è di fornire un programma di aggiornamento/controller front-end per un'app per le barre incorporate. Entrambe queste applicazioni di binari corrono in una scatola vagabonda. Uno script di bash avrebbe funzionato ma gli utenti non sarebbero stati in grado di aggiornarsi su richiesta. –

risposta

6

OK, ho passato la mattinata a risolvere il problema e ho trovato una soluzione!

Tutto quello che dovete fare è impostare la variabile d'ambiente BUNDLE_GEMFILE prima del:

bundle exec rails server -d -p 3000

Sembra che Bundler bisogno di un piccolo aiuto per trovare i progetti Gemfile dato che sto cercando di avviare un'altra applicazione all'interno della bundle corrente, ecco la classe che ho creato per controllare l'app che questo updater sarà responsabile per l'aggiornamento.

Sono felice di dire che il metodo di avvio funziona finalmente come previsto!

class AppController 
    @dir = Rails.root.join('../', 'Other-app/') 

    def self.running? 
    File.exist?("#{@dir}/tmp/pids/server.pid") 
    end 

    def self.start 
    if running? 
     puts "app already running" 
    else 
     Dir.chdir(@dir) 
     puts "starting app..." 
     `BUNDLE_GEMFILE=Gemfile bundle exec rails server -d -p 3000` 
     puts "app started" 
    end 
    end 

    def self.kill 
    if not running? 
     puts "app already dead" 
    else 
     Dir.chdir(@dir) 

     puts "killing app..." 
     `kill $(cat tmp/pids/server.pid)` 
     puts "app dead" 
    end 
    end 

    def self.restart 
    if running? 
     kill 
     start 
    else 
     start 
    end 
    end 
end 
+2

Potresti anche trovare Bundler.with_clean_env interessante –

+0

@FrederickCheung Mi piace, sembra molto più pulito della mia soluzione –

0

Hai ragione Mike !!porto

Dirò appena impostato:

bundle exec rails s -p 3001

bundle exec rails s -p 3000

per due diversi istanza del server!

Cheers!