Wie ändere ich den Standardport des Rails 3-Servers in der Entwicklung?

164

Auf meinem Entwicklungscomputer verwende ich Port 10524. Also starte ich meinen Server folgendermaßen:

rails s -p 10524

Gibt es eine Möglichkeit, den Standardport in 10524 zu ändern, damit ich den Port nicht jedes Mal anhängen muss, wenn ich den Server starte?

Pierre Olivier Martel
quelle
1
einfache Antwort ist Bearbeiten, config/puma.rbwenn Standard-Puma-Server ausgeführt wird
khaverim

Antworten:

132

Erstens - bearbeite nichts in deinem Edelsteinpfad! Es wird alle Projekte beeinflussen und Sie werden später viele Probleme haben ...

Bearbeiten Sie in Ihrem Projekt Folgendes script/rails:

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

Das Prinzip ist einfach: Sie patchen den Server-Runner mit Affen - es beeinflusst also nur ein Projekt.

UPDATE : Ja, ich weiß, dass es eine einfachere Lösung mit Bash-Skript gibt, das Folgendes enthält:

#!/bin/bash
rails server -p 10524

Aber diese Lösung hat einen schwerwiegenden Nachteil - sie ist höllisch langweilig.

Radek Paviensky
quelle
14
Oder sogar ein Alias! alias rs='rails server -p 10524'
Trisweb
2
Stellen Sie sicher, dass Sie require 'rails/commands'NACH dem neuen Material, das Sie einfügen, einfügen. Andernfalls wird Port 3000 weiterhin
getestet.
funktioniert bei mir nicht, beginnt immer noch bei: 3000. Howver @ Spencer-Lösung (auf dieser Seite) funktioniert
Roman
Hat in einem Fall für mich gearbeitet, aber nicht in einem anderen. Als ich meinen eigenen Skriptordner und meine eigene Rails-Datei erstellen musste -> kein großer Erfolg. Hat das wahrscheinlich damit zu tun, ob Rails vom Skript ablaufen oder nicht?
Gards
@ Trisweb Könnten Sie erklären, wie manalias rs
Selvamani
131

Ich möchte Folgendes anhängen 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
quelle
8
Verwenden Sie superanstelle von Alias ​​Hack.
Nowaker
2
Wenn superanstelle von Alias ​​verwendet wird, wird leider die falsche Methode aufgerufen. Es ruft die ::Rack::ServerVersion von default_options auf.
CodingFoo
3
Mit Ruby 2.0 könnten Sie prependein anonymes Modul anstelle von verwenden alias. Dies ermöglicht eine saubere Verwendung von super.
Exbinary
2
Diese Antwort wird Rails::Serverin Kontexten definiert, in denen dies nicht der Fall sein sollte (z. B. Ausführen der Rails-Konsole). Daher empfehle ich, den Code am Ende von zu setzen application.rb, geschützt mit einem if defined?(Rails::Server).
XåpplI'-I0llwlg'I -
29

Noch eine Idee für dich. Erstellen Sie eine Rake-Task, die den Rails-Server mit -p aufruft.

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

dann anrufen rake startstattrails server

Ross
quelle
16

Die Kombination von zwei vorherigen Antworten für Rails 4.0.4 (und vermutlich höher) reicht am Ende von config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end
Thilo
quelle
Wie kann ich diese Option in der laufenden App abrufen? Insbesondere möchte ich einstellen config.action_mailer.default_url_options, sonst zeigt es immer noch auf Port 3000.
Joshua Muheim
Ich habe hier eine diesbezügliche Frage hinzugefügt: stackoverflow.com/questions/29431315/…
Joshua Muheim
7

Wir verwenden Puma als Webserver und dotenv , um Umgebungsvariablen in der Entwicklung festzulegen . Dies bedeutet, dass ich eine Umgebungsvariable für festlegen PORTund in der Puma-Konfiguration darauf verweisen kann.

# .env
PORT=10524


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

Sie müssen Ihre App jedoch foreman startstattdessen mit starten rails s, da sonst die Puma-Konfiguration nicht richtig gelesen wird.

Ich mag diesen Ansatz, weil die Konfiguration in Entwicklung und Produktion genauso funktioniert. Sie ändern bei Bedarf einfach den Wert des Ports.

deklarieren
quelle
4

Inspiriert von Radek und Spencer ... Auf Rails 4 (.0.2 - Ruby 2.1.0) konnte ich dies an config / boot.rb anhängen :

# 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

Alle anderen Konfigurationen in default_options sind weiterhin festgelegt, und Befehlszeilenoptionen überschreiben weiterhin die Standardeinstellungen.

TuK
quelle
3

Lösung für Schienen 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
quelle
Vielen Dank! Ich kam hierher auf der Suche nach einer Lösung mit Schienen 2.3.18 :-)
Prakash Murthy
Ich musste das require File.dirname(__FILE__) + '/../config/boot'vorher bewegen, require 'rack/handler'damit es funktionierte.
Prakash Murthy
1

Sie können $ gem install foremanForeman installieren und Foreman verwenden, um Ihren Server wie folgt zu starten Procfile:

web: bundle exec rails -p 10524

Sie können die foremanGem-Dokumente hier überprüfen : https://github.com/ddollar/foreman für weitere Informationen

Der Vorteil dieses Ansatzes besteht nicht nur darin, dass Sie den Port in der Konfiguration einfach festlegen / ändern können und dass nicht viel Code hinzugefügt werden muss, sondern dass Sie auch verschiedene Schritte hinzufügen können, die Procfileder Vorarbeiter für Sie ausführt, damit Sie dies nicht tun. Sie müssen sie nicht jedes Mal durchgehen, wenn Sie Ihre Anwendung starten möchten.

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

Prost

Mark Jad
quelle
-4

Erstellen Sie in Ihrer Shell einen Alias ​​für den Befehl mit einem angegebenen Port.

Casual Coder
quelle
12
Das Bearbeiten von Dateien in Ihrem Edelsteinpfad ist ... nur für die Mutigsten. Es wird Edelstein-Updates nicht überleben, es wird nicht auf mehr Computern funktionieren usw. Ich würde es wirklich nicht empfehlen
Radek Paviensky
2
Du hast recht. Ihre Lösung ist viel besser. Ich wusste nicht, dass ich es überschreiben kann script/rails. Dank dafür.
Casual Coder