Comment changer le port par défaut du serveur Rails 3 dans le développement?

164

Sur ma machine de développement, j'utilise le port 10524. Je démarre donc mon serveur de cette façon:

rails s -p 10524

Existe-t-il un moyen de changer le port par défaut en 10524 pour ne pas avoir à ajouter le port à chaque fois que je démarre le serveur?

Pierre Olivier Martel
la source
1
la réponse simple est modifier config/puma.rbsi vous exécutez le serveur puma par défaut
khaverim

Réponses:

132

Tout d'abord, ne modifiez rien dans votre chemin de gemme! Cela influencera tous les projets, et vous aurez beaucoup de problèmes plus tard ...

Dans votre projet, modifiez de script/railscette façon:

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

Le principe est simple - vous êtes en train de patcher le serveur runner - il n'influencera donc qu'un seul projet.

MISE À JOUR : Oui, je sais qu'il existe une solution plus simple avec un script bash contenant:

#!/bin/bash
rails server -p 10524

mais cette solution a un sérieux inconvénient - c'est ennuyeux comme l'enfer.

Radek Paviensky
la source
14
Ou même un alias! alias rs='rails server -p 10524'
trisweb le
2
Assurez-vous de mettre require 'rails/commands'APRÈS les nouveaux éléments que vous collez. Sinon, il essaiera toujours le port 3000.
CJBrew
ne fonctionne pas pour moi, commence toujours à: 3000. La solution Howver @Spencer (sur cette page) fonctionne
Roman
J'ai travaillé dans un cas pour moi mais pas dans un autre. Quand j'ai dû créer mon propre dossier de script et fichier de rails -> pas beaucoup de succès. Cela a probablement à voir avec le fait que les rails fonctionnent ou non à partir du script?
gards
@trisweb Pourriez-vous expliquer comment créeralias rs
Selvamani
131

J'aime ajouter ce qui suit à 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
la source
8
Utilisez à la superplace du hack d'alias.
Nowaker
2
Malheureusement, si superest utilisé à la place de l'alias, il appelle la mauvaise méthode. Il appelle la ::Rack::Serverversion de default_options.
codingFoo
3
Avec ruby ​​2.0, vous pouvez prependutiliser un module anonyme au lieu d'utiliser alias. Cela permet une utilisation propre de super.
exbinaire
2
Cette réponse entraînera Rails::Serverà se définir dans des contextes où elle ne devrait pas l'être (ex: exécution de la console Rails). Je recommande donc de mettre le code à la fin de application.rb, gardé avec un if defined?(Rails::Server).
XåpplI'-I0llwlg'I -
29

Encore une idée pour vous. Créez une tâche de râteau qui appelle le serveur rails avec l'option -p.

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

puis appelez rake startau lieu derails server

Ross
la source
16

En combinant deux réponses précédentes, pour Rails 4.0.4 (et plus, probablement), cela suffit à la fin de config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end
Thilo
la source
Comment puis-je récupérer cette option dans l'application en cours d'exécution? Plus précisément, je veux régler config.action_mailer.default_url_options, sinon il pointe toujours vers le port 3000.
Joshua Muheim
J'ai ajouté une question à ce sujet ici: stackoverflow.com/questions/29431315/…
Joshua Muheim
7

Nous utilisons Puma comme serveur Web et dotenv pour définir les variables d'environnement en développement. Cela signifie que je peux définir une variable d'environnement pour PORTet la référencer dans la configuration Puma.

# .env
PORT=10524


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

Cependant, vous devrez démarrer votre application avec foreman startau lieu de rails s, sinon la configuration de puma ne sera pas lue correctement.

J'aime cette approche car la configuration fonctionne de la même manière en développement et en production, il suffit de changer la valeur du port si nécessaire.

déclan
la source
4

Inspiré par Radek et Spencer ... Sur Rails 4 (.0.2 - Ruby 2.1.0), j'ai pu ajouter ceci à 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

Toutes les autres configurations dans default_options sont toujours définies et les commutateurs de ligne de commande remplacent toujours les valeurs par défaut.

TuK
la source
3

Solution pour 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
la source
Merci! Je suis venu ici à la recherche d'une solution avec des rails 2.3.18 :-)
Prakash Murthy
J'ai dû déplacer l' require File.dirname(__FILE__) + '/../config/boot'avant require 'rack/handler'pour que cela fonctionne.
Prakash Murthy
1

Vous pouvez installer $ gem install foremanet utiliser Foreman pour démarrer votre serveur comme défini dans votre Procfilelike:

web: bundle exec rails -p 10524

Vous pouvez consulter la foremandocumentation sur les gemmes ici: https://github.com/ddollar/foreman pour plus d'informations

L'avantage de cette approche est non seulement que vous pouvez définir / modifier facilement le port dans la configuration et qu'il ne nécessite pas beaucoup de code pour être ajouté, mais vous pouvez également ajouter différentes étapes dans le Procfileque le contremaître s'exécutera pour vous afin que vous ne le fassiez pas. Vous devez les parcourir chaque fois que vous souhaitez démarrer votre application, quelque chose comme:

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

À votre santé

Mark Jad
la source
-4

Créez un alias dans votre shell pour la commande avec un port spécifié.

Codeur occasionnel
la source
12
l'édition de fichiers dans votre chemin de gemme est ... eh bien, seulement pour les plus courageux. Il ne survivra pas aux mises à jour des gemmes, il ne fonctionnera pas sur plus d'ordinateurs, etc. Je ne le recommanderais vraiment pas
Radek Paviensky
2
Vous avez raison. Votre solution est bien meilleure. Je ne savais pas que je pouvais passer outre script/rails. Merci pour ça.
Casual Coder