2010-10-01 18 views

Respuesta

125

En primer lugar - no editar cualquier cosa en su camino joya! Que influirá en todos los proyectos, y que tendrá un problema mucho más tarde ...

En su proyecto de edición script/rails esta 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 - usted es mono-parche en el corredor del servidor - por lo que influirá en un solo proyecto.

ACTUALIZACIÓN: Sí, ya sé que la hay solución más simple con escritura del golpe que contiene:

#!/bin/bash 
rails server -p 10524 

pero esta solución tiene un serio inconveniente - es aburrido como el infierno.

+11

¡O incluso un alias! 'Rs = alias 'raíles del servidor -p 10524'' – trisweb

+2

Asegúrese de poner el' requerir' rieles/commands'' DESPUÉS de que el nuevo material se pega. De lo contrario se seguirá intentando puerto 3000. – CJBrew

+0

no funciona para mí, todavía comienza en: 3000. La solución @Spencer de Howver (en esta página) funciona – oyatek

-4

Crear alias en el shell de comandos con un puerto especificado.

+12

edición de archivos en la ruta de la gema es ... bueno, sólo para los más valientes. No sobrevivirá las actualizaciones de gemas, no funcionará en más computadoras, etc. Realmente no lo recomendaría –

+2

Tienes razón. Tu solución es mucho mejor No sabía, que puedo anularlo en 'script/rails'. Gracias por eso. –

125

me gusta agregar la siguiente 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 
+0

¡Impresionante! Gracias – mhenrixon

+0

¡Votaron por un enfoque limpio, bien hecho! –

+0

Enfoque muy limpio y funciona con rieles 3.1! gracias – Tigraine

23

Uno más idea para usted. Cree una tarea de rake que llame al servidor rails con la opción -p.

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

luego llamar a rake start en lugar de rails server

+0

genial :)), +1 ... Gracias – abhijit

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' 
+0

Gracias! Vine aquí buscando una solución con rails 2.3.18 :-) –

+0

Tuve que mover el 'require File.dirname (__ FILE__) + '/../ config/boot'' antes de' require' rack/handler'' para que funcione –

2

Inspirado por Radek y Spencer ... En Los Carriles 4 (.0.2 - Rubí 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 

Todo otra configuración en default_options todavía se fijan, y la línea de comandos todavía anular valores predeterminados.

13

La combinación de dos respuestas anteriores, por los carriles 4.0.4 (en adelante, presumiblemente), esto basta al final de config/boot.rb:

require 'rails/commands/server' 

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

¿Cómo puedo recuperar esta opción en la aplicación en ejecución? En concreto, quiero establecer 'config.action_mailer.default_url_options', de lo contrario sigue apuntando al puerto 3000. –

+0

añadí una pregunta relacionada con esta aquí: http://stackoverflow.com/questions/29431315/actionmailers-default-url- options-how-to-retrieve-port-automatically-from-defa –

3

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

# .env 
PORT=10524 


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

Sin embargo, usted tiene que comenzar su aplicación con foreman start en lugar de rails s, de lo contrario la configuración puma no consigue leer correctamente.

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

0

Se podría instalar $ gem install foreman, y el uso de capataz para comenzar su servidor como se define en su Procfile como:

web: bundle exec rails -p 10524 

Puede comprobar foreman docs joya aquí: https://github.com/ddollar/foreman para obtener más información

El beneficio de esta enfoque no solo 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 Procfile que el capataz ejecutará para usted, de modo que no tenga que ir a través de ellos cada vez que quiera t o iniciar la aplicación que algo como:

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

Saludos

Cuestiones relacionadas