Как изменить порт сервера Rails 3 по умолчанию в разработке?

164

На моей машине для разработки я использую порт 10524. Поэтому я запускаю свой сервер следующим образом:

rails s -p 10524

Есть ли способ изменить порт по умолчанию на 10524, чтобы мне не приходилось добавлять порт при каждом запуске сервера?

Пьер Оливье Мартель
источник
1
простой ответ - редактировать, config/puma.rbесли запущен сервер
Puma по

Ответы:

132

Во-первых, не редактируйте ничего в своем пути к драгоценным камням! Это повлияет на все проекты, и у вас будет много проблем позже ...

В вашем проекте отредактируйте 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'

Принцип прост - вы просто исправляете патч на сервере - так что это повлияет только на один проект.

ОБНОВЛЕНИЕ : Да, я знаю, что есть более простое решение со скриптом bash, содержащим:

#!/bin/bash
rails server -p 10524

но у этого решения есть серьезный недостаток - оно чертовски скучно.

Радек Павиенский
источник
14
Или даже псевдоним! alias rs='rails server -p 10524'
trisweb
2
Обязательно вставьте require 'rails/commands'ПОСЛЕ нового материала, который вы вставляете. В противном случае он все равно попробует порт 3000.
CJBrew
не работает для меня, все еще начинается в: 3000. Как работает решение @Spencer (на этой странице)
Роман
Работал в одном случае для меня, но не в другом. Когда мне нужно было создать свою собственную папку скриптов и файл rails -> не большой успех. Вероятно, имеет отношение к тому, работает ли rails вне сценария или нет?
gards
@trisweb Не могли бы вы объяснить, как создатьalias rs
Selvamani
131

Я хотел бы добавить следующее к 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
спенсер
источник
8
Используйте superвместо псевдонима взломать.
Новакер
2
К сожалению, если superвместо псевдонима используется неверный метод. Он вызывает ::Rack::Serverверсию default_options.
codingFoo
3
С ruby ​​2.0 вы можете prependиспользовать анонимный модуль вместо использования alias. Это позволяет чистое использование super.
exbinary
2
Этот ответ приведет Rails::Serverк тому, что он будет определен в контекстах, когда этого не должно быть (например, при запуске консоли Rails). Поэтому я рекомендую поставить код в конце application.rb, охраняемый с if defined?(Rails::Server).
XåpplI'-I0llwlg'I -
29

Еще одна идея для вас. Создайте задачу rake, которая вызывает сервер rails с параметром -p.

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

тогда звоните rake startвместоrails server

Росс
источник
16

Объединяя два предыдущих ответа для Rails 4.0.4 (и выше, предположительно), этого достаточно в конце config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end
Тило
источник
Как я могу получить эту опцию в запущенном приложении? В частности, я хочу установить config.action_mailer.default_url_options, в противном случае он по-прежнему указывает на порт 3000.
Джошуа Мухайм
Я добавил вопрос, связанный с этим здесь: stackoverflow.com/questions/29431315/…
Джошуа Мухайм
7

Мы используем Puma в качестве веб-сервера и dotenv для установки переменных среды в процессе разработки. Это означает, что я могу установить переменную окружения PORTи ссылаться на нее в конфигурации Puma.

# .env
PORT=10524


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

Однако foreman startвместо этого вам придется запускать приложение rails s, иначе конфигурация puma не будет прочитана должным образом.

Мне нравится этот подход, потому что конфигурация работает одинаково при разработке и производстве, вы просто меняете значение порта, если это необходимо.

Деклан
источник
4

Вдохновленный Радеком и Спенсером ... На Rails 4 (.0.2 - Ruby 2.1.0) я смог добавить это в 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

Все остальные настройки в параметрах default_options по-прежнему установлены, а параметры командной строки по-прежнему переопределяют значения по умолчанию.

TuK
источник
3

Решение для 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
источник
Спасибо! Я пришел сюда в поисках решения с рельсами 2.3.18 :-)
Пракаш Мурти
Я должен был переместить require File.dirname(__FILE__) + '/../config/boot'раньше, require 'rack/handler'чтобы это работало.
Пракаш Мурти
1

Вы можете установить $ gem install foremanи использовать foreman для запуска вашего сервера, как определено в вашем Procfileподобном:

web: bundle exec rails -p 10524

Вы можете проверить foremanдокументацию Gem здесь: https://github.com/ddollar/foreman для получения дополнительной информации

Преимущество этого подхода состоит не только в том, что вы можете легко установить / изменить порт в конфигурации и что он не требует большого количества кода для добавления, но также вы можете добавить различные шаги в том, Procfileчто мастер будет работать для вас, так что вы не будете ' вам не нужно проходить через них каждый раз, когда вы хотите запустить приложение, например:

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

ура

Марк Жад
источник
-4

Создайте псевдоним в вашей оболочке для команды с указанным портом.

Случайный кодер
источник
12
редактирование файлов в вашем пути к драгоценным камням ... ну, только для самых смелых. Он не выдержит обновления гемов, он не будет работать на большем количестве компьютеров и т. Д. Я действительно не рекомендовал бы это
Радек Павиенский
2
Ты прав. Ваше решение намного лучше. Я не знал, что могу это переопределить script/rails. Спасибо за это.
Казуальный кодер