【发布时间】:2013-08-07 12:24:23
【问题描述】:
我知道我可以通过-p 选项在另一个端口上启动rails 服务器。但只要我启动 webrick,我想为每个应用程序设置另一个端口。
有什么想法吗?
问候 费利克斯
【问题讨论】:
标签: port ruby-on-rails-4 webrick
我知道我可以通过-p 选项在另一个端口上启动rails 服务器。但只要我启动 webrick,我想为每个应用程序设置另一个端口。
有什么想法吗?
问候 费利克斯
【问题讨论】:
标签: port ruby-on-rails-4 webrick
将此附加到config/boot.rb:
require 'rails/commands/server'
module DefaultOptions
def default_options
super.merge!(Port: 3001)
end
end
Rails::Server.send(:prepend, DefaultOptions)
注意:需要 ruby >= 2.0。
【讨论】:
prepend是公开的,不需要经过send:Rails::Server.prepend(DefaultOptions)。
rails server (像往常一样)运行服务器,而不是选择需要调用其他东西的答案。
快速解决方案:追加到Rakefile
task :server do
`bundle exec rails s -p 8080`
end
然后运行rake server
【讨论】:
您可以像这样启动 WEBrick:
rails server -p 8080
8080 是您的端口。如果您愿意,可以将其放入 bash 脚本中以方便使用。
您可以安装 $ gem install foreman,并使用 foreman 来启动您在 Procfile 中定义的生产网络服务器(例如 unicorn),如下所示:$ foreman run web。如果 unicorn 是您的 Web 服务器,您可以在 unicorn 配置文件中指定端口(与大多数服务器选择一样)。这种方法的好处不仅在于您可以在配置中设置端口,而且您使用的环境更接近生产环境。
【讨论】:
如果您将默认选项放在 config/boot.rb 上,则 rake 和 rails 的所有命令属性都会失败(例如:rake -T 或 rails g model user)! 因此,请将其附加到 bin/rails 之后行 require_relative '../config/boot' 并且代码仅针对 rails 服务器命令执行:
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
bin/rails 文件如下所示:
#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
# Set default host and port to rails server
if ARGV.first == 's' || ARGV.first == 'server'
require 'rails/commands/server'
module Rails
class Server
def default_options
super.merge(Host: '0.0.0.0', Port: 3000)
end
end
end
end
require 'rails/commands'
【讨论】:
对于 Rails 5.1:
# config/boot.rb
# ... existing code
require 'rails/command'
require 'rails/commands/server/server_command'
Rails::Command::ServerCommand.send(:remove_const, 'DEFAULT_PORT')
Rails::Command::ServerCommand.const_set('DEFAULT_PORT', 3333)
【讨论】: