2015-02-23 8 views
70

Dopo aver aggiornato l'applicazione per le rotaie del nostro team a 4.2, come indicato dallo release note, l'indirizzo IP predefinito rails server viene modificato in localhost da 0.0.0.0.Come modificare l'IP di binding predefinito del server di sviluppo Rails 4.2?

Sviluppiamo con Vagrant e vogliamo che il server di sviluppo sia accessibile direttamente dal browser sulla macchina host.

Invece di digitare rails s -b 0.0.0.0 ogni volta da ora in poi, mi chiedo se c'è una soluzione più elegante, in modo che possiamo ancora usare sth semplice come rails s per avviare il server. Forse:

  • un file di configurazione rails s legge dove posso modificare l'ip di legame di default (senza l'utilizzo di -c)
  • porta avanti con vagabondo (provato ma non è riuscito, vedere problema incontrato qui sotto)
  • una patch scimmia rack, che cambia il binding predefinito ip

Il vero obiettivo dietro questo è che voglio che l'aggiornamento sia scorrevole tra il nostro team, evitando il problema che le persone dovranno riavviare costantemente il loro server di rails a causa della mancanza di -b 0.0.0.0 parte.

Ho tentato il port forwarding vagante, ma ancora ottengo Connection Refused quando visito localhost:3000 sulla macchina host. Le due linee di configurazione che ho provato erano:

config.vm.network "forwarded_port", guest: 3000, host: 3000 
config.vm.network "forwarded_port", guest: 3000, guest_ip: '127.0.0.1', host: 3000 

Non ho trovato istruzioni pertinenti nei documenti ufficiali. Qualsiasi aiuto sarà apprezzato.

+3

rails 5 answer: https://stackoverflow.com/a/33852354/520567 – akostadinov

risposta

64

Sto avendo lo stesso problema qui e ho trovato oggi una soluzione migliore. Basta aggiungere questo codice al tuo file config/boot.rb e dovrebbe funzionare con vagabondo.

require 'rails/commands/server' 
module Rails 
    class Server 
    def default_options 
     super.merge(Host: '0.0.0.0', Port: 3000) 
    end 
    end 
end 

ps: la sua base a: this answer

+1

Grazie mille ...... –

+1

Con questo approccio, si perdono le [altre impostazioni predefinite] (https://github.com/rails/rails/blob/v4.2.5.1/railties/lib/rails/ comandi/server.rb # L109). Vedi Vanitas [risposta] (http://stackoverflow.com/a/33249657/2464148) di seguito per un'alternativa. –

+0

Sono d'accordo, dai un'occhiata alla risposta di Vanita – ringe

34

È possibile utilizzare foreman per eseguire un Procfile con i tuoi comandi personalizzati:

# Procfile in Rails application root 
web:  bundle exec rails s -b 0.0.0.0 

Ora avviare l'applicazione Rails con:

foreman start 

La cosa buona di caposquadra è che è possibile aggiungere altre applicazioni al Procfile (come sidekiq, mailcatcher).

La cosa brutta di Foreman è che devi addestrare la tua squadra a gestire foreman start anziché rails s.

+0

grazie. accetterò la tua risposta in pochi giorni se risultasse essere la soluzione migliore :) –

+0

Anche il "caposquadra" abbreviato funzionerà - potrebbe essere una transizione più facile da "rails s". –

5

Se si mettono le opzioni di default su config/boot.rb allora tutti gli attributi di comando per il rastrello e rotaie non riesce (ad esempio: rake -T o rails g model user)! Quindi, aggiungere questo per bin/rails dopo la linea require_relative '../config/boot' e il codice viene eseguito solo per il comando rotaie server:

if ARGV.first == 's' || ARGV.first == 'server' 
    require 'rails/commands/server' 
    module Rails 
    class Server 
     def default_options 
     super.merge(Host: '0.0.0.0', Port: 3000) 
     end 
    end 
    end 
end 

I bin/rails loks di file in questo modo:

#!/usr/bin/env ruby 
APP_PATH = File.expand_path('../../config/application', __FILE__) 
require_relative '../config/boot' 

# Set default host and port to rails server 
if ARGV.first == 's' || ARGV.first == 'server' 
    require 'rails/commands/server' 
    module Rails 
    class Server 
     def default_options 
     super.merge(Host: '0.0.0.0', Port: 3000) 
     end 
    end 
    end 
end 

require 'rails/commands' 
17

Met lo stesso problema. Trovato il blog Make Rails 4.2 server listens to all interfaces.

Aggiungere il seguente alla config/boot.rb

require 'rails/commands/server' 

module Rails 
    class Server 
    alias :default_options_bk :default_options 
    def default_options 
     default_options_bk.merge!(Host: '0.0.0.0') 
    end 
    end 
end 
+1

questa risposta ha il vantaggio di non perdere le [impostazioni predefinite originali] (https://github.com/rails/rails/blob/v4.2.5.1/railties/lib/rails/commands/server.rb#L109) (vale a dire, porta 3000!) –

+0

questa soluzione funziona per me – ringe

0

Ecco una soluzione semplice che sto usando. Mi piace/ho già bisogno di dotenv e puma-heroku, quindi se l'utilizzo di quelli non funziona per voi, questo potrebbe non essere adatto a voi.

/config/puma.rb

plugin :heroku 

Gemfile

gem 'dotenv-rails', groups: [:development, :test] 

.env

PORT=8080 

Ora posso iniziare sia dev e produzione con rails s.

Problemi correlati