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

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

rails s -p 10524

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

Ответ 1

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

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

Принцип прост - вы обезвреживаете обезьяну бегуна сервера, поэтому он будет влиять только на один проект.

UPDATE: Да, я знаю, что существует более простое решение с bash script, содержащее:

#!/bin/bash
rails server -p 10524

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

Ответ 2

Мне нравится добавить следующее к 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

Ответ 3

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

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

затем вызовите rake start вместо rails server

Ответ 4

Объединяя два предыдущих ответа, для 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

Ответ 5

Решение для 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'

Ответ 6

Вдохновленный Радеком и Спенсером... В 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 все еще установлены, а параметры командной строки по-прежнему переопределяют значения по умолчанию.

Ответ 7

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

# .env
PORT=10524


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

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

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

Ответ 8

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

web: bundle exec rails -p 10524

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

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

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

Приветствия

Ответ 9

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