Jak zmienić domyślny port serwera Rails 3 w rozwoju?

164

Na moim komputerze deweloperskim używam portu 10524. Tak więc uruchamiam serwer:

rails s -p 10524

Czy jest sposób, aby zmienić domyślny port na 10524, aby nie musiał dodawać portu za każdym razem, gdy uruchamiam serwer?

Pierre Olivier Martel
źródło
1
Prosta odpowiedź brzmi: edytuj, config/puma.rbjeśli uruchamiasz domyślny serwer puma
khaverim

Odpowiedzi:

132

Po pierwsze - nie edytuj niczego na swojej ścieżce klejnotów! Wpłynie to na wszystkie projekty, a później będziesz miał sporo problemów ...

W swoim projekcie edytuj w script/railsten sposób:

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

Zasada jest prosta - małpa łatasz runnera serwera - więc wpłynie to tylko na jeden projekt.

AKTUALIZACJA : Tak, wiem, że istnieje prostsze rozwiązanie ze skryptem bash zawierającym:

#!/bin/bash
rails server -p 10524

ale to rozwiązanie ma poważną wadę - jest nudne jak cholera.

Radek Paviensky
źródło
14
Albo nawet alias! alias rs='rails server -p 10524'
trisweb
2
Pamiętaj, aby wstawić require 'rails/commands'PO nowej rzeczy, którą wklejasz. W przeciwnym razie nadal będzie próbować portu 3000.
CJBrew
dla mnie nie działa, nadal zaczyna się od: 3000. Jak działa rozwiązanie @Spencer (na tej stronie)
Roman
Pracował w jednym przypadku dla mnie, ale nie w innym. Kiedy musiałem stworzyć własny folder skryptów i plik railsów -> niezbyt duży sukces. Prawdopodobnie ma to związek z tym, czy railsy działają poza skryptem, czy nie?
Gards
@trisweb Czy mógłbyś wyjaśnić, jak tworzyćalias rs
Selvamani
131

Lubię dołączyć następujące informacje do 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
źródło
8
Użyj superzamiast aliasu hack.
Nowaker
2
Niestety, jeśli superjest używany zamiast aliasu, wywołuje niewłaściwą metodę. Wzywa ::Rack::Serverwersję default_options.
codingFoo
3
W Ruby 2.0 możesz prependzamiast używać anonimowego modułu alias. Pozwala to na czyste użycie super.
exbinary
2
Ta odpowiedź spowoduje, że Rails::Serverzostanie zdefiniowana w kontekstach, w których nie powinna (np. Uruchamianie konsoli Rails). Dlatego polecam umieścić kod na końcu application.rb, chroniony rozszerzeniem if defined?(Rails::Server).
XåpplI'-I0llwlg'I -
29

Jeszcze jeden pomysł dla Ciebie. Utwórz zadanie rake, które wywołuje serwer rails z opcją -p.

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

wtedy zadzwoń rake startzamiastrails server

Ross
źródło
16

Łącząc dwie poprzednie odpowiedzi, dla Rails 4.0.4 (i nowszych, przypuszczalnie), to wystarczy na koniec config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end
Thilo
źródło
Jak mogę pobrać tę opcję w uruchomionej aplikacji? W szczególności chcę ustawić config.action_mailer.default_url_options, w przeciwnym razie nadal wskazuje port 3000.
Joshua Muheim
Dodałem tutaj pytanie związane z tym: stackoverflow.com/questions/29431315/…
Joshua Muheim
7

Używamy Pumy jako serwera WWW i dotenv do ustawiania zmiennych środowiskowych w fazie rozwoju. Oznacza to, że mogę ustawić zmienną środowiskową dla PORTi odwołać się do niej w konfiguracji Puma.

# .env
PORT=10524


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

Musisz jednak uruchomić aplikację za pomocą foreman startzamiastrails s , w przeciwnym razie konfiguracja puma nie zostanie poprawnie odczytana.

Podoba mi się to podejście, ponieważ konfiguracja działa w ten sam sposób w programowaniu i produkcji, po prostu zmieniasz wartość portu, jeśli to konieczne.

declan
źródło
4

Zainspirowany przez Radka i Spencera ... Na Rails 4 (.0.2 - Ruby 2.1.0), udało mi się dodać to do 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

Cała inna konfiguracja w default_options jest nadal ustawiona, a przełączniki wiersza polecenia nadal zastępują wartości domyślne.

TuK
źródło
3

Rozwiązanie dla 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
źródło
Dzięki! Przyszedłem tutaj szukając rozwiązania z szynami 2.3.18 :-)
Prakash Murthy
Musiałem przesunąć require File.dirname(__FILE__) + '/../config/boot'przed require 'rack/handler', aby zadziałało.
Prakash Murthy
1

Możesz zainstalować $ gem install foremani użyć brygadzisty, aby uruchomić serwer, jak zdefiniowano w Procfile:

web: bundle exec rails -p 10524

Możesz sprawdzić foremandokumenty klejnotów tutaj: https://github.com/ddollar/foreman, aby uzyskać więcej informacji

Zaletą tego podejścia jest nie tylko możliwość łatwego ustawienia / zmiany portu w konfiguracji i to, że nie wymaga to dużej ilości kodu do dodania, ale także możesz dodać różne kroki w tym, Procfileże brygadzista będzie działał za Ciebie, więc nie nie musisz przechodzić przez nie za każdym razem, gdy chcesz uruchomić aplikację, na przykład:

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

Twoje zdrowie

Mark Jad
źródło
-4

Utwórz alias w swojej powłoce dla polecenia z określonym portem.

Casual Coder
źródło
12
edytowanie plików na twojej ścieżce klejnotów jest ... cóż, tylko dla najodważniejszych. Nie przetrwa aktualizacji klejnotów, nie będzie działać na większej liczbie komputerów itp. Naprawdę nie poleciłbym go
Radek Paviensky
2
Masz rację. Twoje rozwiązanie jest znacznie lepsze. Nie wiedziałem, że mogę to zmienić script/rails. Dziękuję za to.
Casual Coder