Como alterar a porta padrão do servidor Rails 3 no desenvolvimento?

164

Na minha máquina de desenvolvimento, uso a porta 10524. Portanto, inicio o servidor da seguinte maneira:

rails s -p 10524

Existe uma maneira de alterar a porta padrão para 10524, para que eu não precise acrescentar a porta toda vez que iniciar o servidor?

Pierre Olivier Martel
fonte
1
resposta simples é editar config/puma.rbse estiver rodando servidor puma padrão
khaverim

Respostas:

132

Primeiro - não edite nada no seu caminho de gema! Isso influenciará todos os projetos, e você terá muitos problemas mais tarde ...

No seu projeto, edite script/railsdesta maneira:

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

O princípio é simples - você faz o patch do macaco no corredor do servidor - para que ele influencie apenas um projeto.

UPDATE : Sim, eu sei que existe uma solução mais simples com o script bash que contém:

#!/bin/bash
rails server -p 10524

mas essa solução tem uma séria desvantagem - é chata como o inferno.

Radek Paviensky
fonte
14
Ou mesmo um apelido! alias rs='rails server -p 10524'
trisweb 4/09/13
2
Certifique-se de colocar o require 'rails/commands'depois que o novo material que você colar no Caso contrário, ele ainda vai tentar porta 3000..
CJBrew
não funciona para mim, ainda começa em: 3000. A solução Howver @Spencer (nesta página) funciona
Roman
Trabalhou em um exemplo para mim, mas não em outro. Quando tive que criar minha própria pasta de scripts e arquivo rails -> não obtive grande sucesso. Provavelmente tem a ver com o fato de o Rails estar ou não executando o script ou não?
Gards
@trisweb Você poderia explicar como criar?alias rs
Selvamani
131

Gostaria de acrescentar o seguinte 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
fonte
8
Use em supervez de alias hack.
Nowaker
2
Infelizmente, se superfor usado em vez de alias, ele chamará o método errado. Chama a ::Rack::Serverversão de default_options.
codingFoo
3
Com o ruby ​​2.0, você pode prependusar um módulo anônimo em vez de usar alias. Isso permite um uso limpo de super.
exbinary
2
Esta resposta fará com Rails::Serverque seja definida em contextos quando não deveria (por exemplo, executando o console do Rails). Portanto, recomendo colocar o código no final de application.rb, guardado com um if defined?(Rails::Server).
XåpplI'-I0llwlg'I - 5/08/2015
29

Mais uma ideia para você. Crie uma tarefa de rake que chame o servidor rails com o -p.

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

depois chame em rake startvez derails server

Ross
fonte
16

Combinando duas respostas anteriores, para o Rails 4.0.4 (e superior, presumivelmente), isso basta no final de config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end
Thilo
fonte
Como posso recuperar essa opção no aplicativo em execução? Especificamente, eu quero definir config.action_mailer.default_url_options, caso contrário, ele ainda está apontando para a porta 3000.
Joshua Muheim
Eu adicionei uma pergunta relacionada com esta aqui: stackoverflow.com/questions/29431315/...
Joshua Muheim
7

Estamos usando o Puma como servidor da Web e o dotenv para definir variáveis ​​de ambiente no desenvolvimento. Isso significa que eu posso definir uma variável de ambiente PORTe referenciá-la na configuração do Puma.

# .env
PORT=10524


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

No entanto, você precisará iniciar seu aplicativo em foreman startvez derails s , caso contrário, a configuração do puma não será lida corretamente.

Eu gosto dessa abordagem porque a configuração funciona da mesma maneira no desenvolvimento e na produção, você apenas altera o valor da porta, se necessário.

declinar
fonte
4

Inspirado por Radek e Spencer ... No Rails 4 (.0.2 - Ruby 2.1.0), pude anexar isso ao 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 as outras configurações em default_options ainda estão definidas e as opções de linha de comando ainda substituem os padrões.

TuK
fonte
3

Solução 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
fonte
Obrigado! Eu vim aqui procurando uma solução com trilhos 2.3.18 :-)
Prakash Murthy
Eu tive que mudar o require File.dirname(__FILE__) + '/../config/boot'antes require 'rack/handler'para que funcionasse.
Prakash Murthy
1

Você pode instalar $ gem install foremane usar o foreman para iniciar seu servidor conforme definido em seu Procfilegosto:

web: bundle exec rails -p 10524

Você pode verificar os foremandocumentos da gema aqui: https://github.com/ddollar/foreman para obter mais informações

O benefício dessa abordagem é que você não apenas pode configurar / alterar a porta na configuração facilmente e que não requer muito código a ser adicionado, mas também pode adicionar etapas diferentes para Procfileque o capataz o execute para que você não Não é necessário analisá-los toda vez que você deseja iniciar seu aplicativo, algo como:

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

Felicidades

Mark Jad
fonte
-4

Crie um alias no seu shell para comando com uma porta especificada.

Casual Coder
fonte
12
editar arquivos no caminho da gema é ... bem, apenas para os mais corajosos. Ele não vai sobreviver atualizações gema, não irá funcionar em mais computadores, etc. Eu realmente não recomendo
Radek Paviensky
2
Você está certo. Sua solução é muito melhor. Eu não sabia, que posso substituí-lo script/rails. Obrigado por isso.
Casual Coder