Come modificare la porta predefinita del server Rails 3 in via di sviluppo?


164

Sulla mia macchina di sviluppo, utilizzo la porta 10524. Quindi avvio il mio server in questo modo:

rails s -p 10524

C'è un modo per cambiare la porta predefinita in 10524 in modo da non dover aggiungere la porta ogni volta che avvio il server?


1
la risposta semplice viene modificata config/puma.rbse si esegue il server puma predefinito
khaverim il

Risposte:


132

Primo: non modificare nulla nel percorso della gemma! Influenzerà tutti i progetti e in seguito avrai molti problemi ...

Nel tuo progetto modifica in script/railsquesto modo:

#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)

# THIS IS NEW:
require "rails/commands/server"
module Rails
  class Server
    def default_options
      super.merge({
        :Port        => 10524,
        :environment => (ENV['RAILS_ENV'] || "development").dup,
        :daemonize   => false,
        :debugger    => false,
        :pid         => File.expand_path("tmp/pids/server.pid"),
        :config      => File.expand_path("config.ru")
      })
    end
  end
end
# END OF CHANGE
require 'rails/commands'

Il principio è semplice - stai correggendo le scimmie sul server runner - quindi influenzerà solo un progetto.

AGGIORNAMENTO : Sì, so che esiste una soluzione più semplice con script bash contenente:

#!/bin/bash
rails server -p 10524

ma questa soluzione ha un grave svantaggio: è noiosa da morire.


14
O anche un alias! alias rs='rails server -p 10524'
trisweb,

2
Assicurati di mettere require 'rails/commands'DOPO le nuove cose che incolli. Altrimenti proverà comunque la porta 3000.
CJBrew

non funziona per me, inizia ancora da: 3000. Howver @Spencer solution (in questa pagina) funziona
Roman,

Ha funzionato in un caso per me ma non in un altro. Quando ho dovuto creare la mia cartella di script e file rails -> non un grande successo. Probabilmente ha a che fare con il fatto che rails stia scappando o meno dallo script?
gards

@trisweb Potresti spiegare come crearealias rs
Selvamani,

131

Mi piace aggiungere quanto segue a config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Port => 3333)
    end    
  end
end

8
Usa superinvece di alias hack.
Nowaker,

2
Sfortunatamente, se superusato al posto dell'alias, chiama il metodo sbagliato. Chiama la ::Rack::Serverversione di default_options.
coding:

3
Con ruby ​​2.0 potresti creare prependun modulo anonimo invece di usarlo alias. Ciò consente un uso pulito di super.
exbinary

2
Questa risposta verrà Rails::Serverdefinita in contesti in cui non dovrebbe essere (ad es. Eseguendo la console di Rails). Quindi consiglio di mettere il codice alla fine application.rb, protetto da un if defined?(Rails::Server).
XåpplI'-I0llwlg'I -

29

Un'altra idea per te. Crea un'attività rake che chiama il server rails con -p.

task "start" => :environment do
  system 'rails server -p 3001'
end

quindi chiama rake startinvece dirails server


16

Combinando due risposte precedenti, per Rails 4.0.4 (e versioni successive, presumibilmente), questo è sufficiente alla fine di config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end

Come posso recuperare questa opzione nell'app in esecuzione? In particolare, voglio impostare config.action_mailer.default_url_options, altrimenti punta ancora alla porta 3000.
Joshua Muheim

Ho aggiunto una domanda relativa a questo qui: stackoverflow.com/questions/29431315/…
Joshua Muheim,

7

Stiamo usando Puma come web server e dotenv per impostare le variabili di ambiente in fase di sviluppo. Questo significa che posso impostare una variabile d'ambiente per PORTe fare riferimento nella configurazione di Puma.

# .env
PORT=10524


# config/puma.rb
port ENV['PORT']

Tuttavia, dovrai avviare la tua app con foreman startinvece di rails s, altrimenti la configurazione di puma non verrà letta correttamente.

Mi piace questo approccio perché la configurazione funziona allo stesso modo nello sviluppo e nella produzione, basta cambiare il valore della porta se necessario.


4

Ispirato da Radek e Spencer ... Su Rails 4 (.0.2 - Ruby 2.1.0), sono stato in grado di aggiungere questo a config / boot.rb :

# config/boot.rb

# ...existing code

require 'rails/commands/server'

module Rails
  # Override default development
  # Server port
  class Server
    def default_options
      super.merge(Port: 3100)
    end
  end
end

Tutte le altre configurazioni in default_options sono ancora impostate e le opzioni della riga di comando hanno ancora la precedenza sui valori predefiniti.


3

Soluzione per Rails 2.3 - script/server:

#!/usr/bin/env ruby
require 'rack/handler'
module Rack::Handler
  class << WEBrick
    alias_method :old_run, :run
  end

  class WEBrick
    def self.run(app, options={})
      options[:Port] = 3010 if options[:Port] == 3000
      old_run(app, options)
    end
  end
end

require File.dirname(__FILE__) + '/../config/boot'
require 'commands/server'

Grazie! Sono venuto qui alla ricerca di una soluzione con binari 2.3.18 :-)
Prakash Murthy,

Ho dovuto spostare il require File.dirname(__FILE__) + '/../config/boot'prima require 'rack/handler'perché funzionasse.
Prakash Murthy,

1

È possibile installare $ gem install foremane utilizzare foreman per avviare il server come definito nel proprio Procfilelike:

web: bundle exec rails -p 10524

Puoi consultare i foremandocumenti gemma qui: https://github.com/ddollar/foreman per maggiori informazioni

Il vantaggio di questo approccio non è solo che puoi impostare / modificare facilmente la porta nella configurazione e che non richiede molto codice da aggiungere, ma puoi anche aggiungere diversi passaggi in cui il Procfilecaposquadra verrà eseguito per te, quindi non ' devo provarli ogni volta che vuoi avviare la tua applicazione qualcosa del tipo:

bundle: bundle install
web: bundle exec rails -p 10524
...
...

Saluti


-4

Creare un alias nella shell per il comando con una porta specificata.


12
la modifica dei file nel percorso gemma è ... beh, solo per i più coraggiosi. Non sopravviverà agli aggiornamenti delle gemme, non funzionerà su più computer, ecc. Non lo consiglierei davvero
Radek Paviensky,

2
Hai ragione. La tua soluzione è molto meglio. Non sapevo, che posso scavalcarlo script/rails. Grazie per quello
Casual Coder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.