¿Cómo cambiar el puerto predeterminado del servidor Rails 3 en desarrollo?

164

En mi máquina de desarrollo, uso el puerto 10524. Así que inicio mi servidor de esta manera:

rails s -p 10524

¿Hay alguna forma de cambiar el puerto predeterminado a 10524 para que no tenga que agregar el puerto cada vez que inicio el servidor?

Pierre Olivier Martel
fuente
1
respuesta simple es editar config/puma.rbsi se ejecuta el servidor por defecto puma
khaverim

Respuestas:

132

Primero: ¡no edites nada en tu camino de gemas! Influirá en todos los proyectos, y tendrás muchos problemas más tarde ...

En su proyecto edite de script/railsesta manera:

#!/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'

El principio es simple: está aplicando un parche mono al corredor del servidor, por lo que influirá en un solo proyecto.

ACTUALIZACIÓN : Sí, sé que hay una solución más simple con un script bash que contiene:

#!/bin/bash
rails server -p 10524

Pero esta solución tiene un serio inconveniente: es aburrida como el infierno.

Radek Paviensky
fuente
14
O incluso un alias! alias rs='rails server -p 10524'
trisweb
2
Asegúrese de poner require 'rails/commands'DESPUÉS de las cosas nuevas que pegue. De lo contrario, seguirá probando el puerto 3000.
CJBrew
no funciona para mí, todavía comienza en: 3000. La solución Howver @Spencer (en esta página) funciona
Roman
Trabajó en una instancia para mí pero no en otra. Cuando tuve que crear mi propia carpeta de script y archivo de rieles -> no fue un gran éxito. ¿Probablemente tiene que ver con si los rieles se están ejecutando o no del script?
Gards
@trisweb ¿Podría explicar cómo crearalias rs
Selvamani
131

Me gusta agregar lo siguiente 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
Spencer
fuente
8
Usar en superlugar de alias hack.
Nowaker
2
Desafortunadamente, si superse usa en lugar de alias, llama al método incorrecto. Llama a la ::Rack::Serverversión de default_options.
codingFoo
3
Con ruby ​​2.0 podrías prependusar un módulo anónimo en lugar de usarlo alias. Esto permite un uso limpio de super.
Exbinary
2
Esta respuesta hará Rails::Serverque se defina en contextos cuando no debería serlo (por ejemplo, ejecutar la consola de Rails). Así que recomiendo poner el código al final de application.rb, guardado con un if defined?(Rails::Server).
XåpplI'-I0llwlg'I -
29

Una idea más para ti. Cree una tarea de rastrillo que llame al servidor de rails con -p.

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

luego llame en rake startlugar derails server

Ross
fuente
16

Combinando dos respuestas anteriores, para Rails 4.0.4 (y superior, presumiblemente), esto es suficiente al final de config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end
Thilo
fuente
¿Cómo puedo recuperar esta opción en la aplicación en ejecución? Específicamente, quiero configurar config.action_mailer.default_url_options, de lo contrario, todavía apunta al puerto 3000.
Joshua Muheim
Agregué
7

Estamos usando Puma como servidor web y dotenv para establecer variables de entorno en el desarrollo. Esto significa que puedo establecer una variable de entorno PORTy hacer referencia a ella en la configuración de Puma.

# .env
PORT=10524


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

Sin embargo, tendrá que iniciar su aplicación con en foreman startlugar de rails s, de lo contrario, la configuración de puma no se lee correctamente.

Me gusta este enfoque porque la configuración funciona de la misma manera en el desarrollo y la producción, simplemente cambia el valor del puerto si es necesario.

declan
fuente
4

Inspirado por Radek y Spencer ... On Rails 4 (.0.2 - Ruby 2.1.0), pude agregar esto 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

Todas las demás configuraciones en default_options todavía están establecidas, y los modificadores de la línea de comandos aún anulan los valores predeterminados.

TuK
fuente
3

Solución para 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'
Nowaker
fuente
¡Gracias! Vine aquí buscando una solución con rieles 2.3.18 :-)
Prakash Murthy
Tuve que mover el require File.dirname(__FILE__) + '/../config/boot'antes require 'rack/handler'para que funcione.
Prakash Murthy
1

Puede instalar $ gem install foremany usar foreman para iniciar su servidor como se define en su me Procfilegusta:

web: bundle exec rails -p 10524

Puede consultar foremanlos documentos de gemas aquí: https://github.com/ddollar/foreman para obtener más información

El beneficio de este enfoque no solo es que puede configurar / cambiar el puerto en la configuración fácilmente y que no requiere que se agregue mucho código, sino que también puede agregar diferentes pasos en el Procfileque el capataz se ejecutará para usted, así que no No tiene que pasar por ellas cada vez que quiera iniciar su aplicación, algo como:

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

Salud

Mark Jad
fuente
-4

Cree un alias en su shell para el comando con un puerto especificado.

Codificador casual
fuente
12
editar archivos en tu camino de gemas es ... bueno, solo para los más valientes. No sobrevivirá a las actualizaciones de gemas, no funcionará en más computadoras, etc. Realmente no lo recomendaría
Radek Paviensky
2
Tienes razón. Tu solución es mucho mejor. No sabía, que puedo anularlo script/rails. Gracias por eso.
casual del