【发布时间】:2011-04-20 01:26:20
【问题描述】:
在我的开发机器上,我使用端口 10524。所以我以这种方式启动我的服务器:
rails s -p 10524
有没有办法将默认端口更改为 10524,这样我就不必每次启动服务器时都附加端口?
【问题讨论】:
-
简单的答案是编辑
config/puma.rb如果运行默认 puma 服务器
标签: ruby-on-rails
在我的开发机器上,我使用端口 10524。所以我以这种方式启动我的服务器:
rails s -p 10524
有没有办法将默认端口更改为 10524,这样我就不必每次启动服务器时都附加端口?
【问题讨论】:
config/puma.rb 如果运行默认 puma 服务器
标签: ruby-on-rails
首先 - 不要在您的 gem 路径中编辑任何内容!会影响所有的项目,以后会遇到很多问题……
在您的项目中以这种方式编辑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
但是这个解决方案有一个严重的缺点——它很无聊。
【讨论】:
alias rs='rails server -p 10524'
require 'rails/commands'放在你粘贴的新东西之后。否则它仍然会尝试端口3000。
alias rs
我喜欢将以下内容附加到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
【讨论】:
super而不是别名hack。
super 代替别名,则会调用错误的方法。它调用::Rack::Server 版本的default_options。
prepend 一个匿名模块,而不是使用alias。这允许干净地使用super。
Rails::Server 在不应该定义的上下文中定义(例如,运行 Rails 控制台)。所以我建议将代码放在application.rb 的末尾,用if defined?(Rails::Server) 保护。
再给你一个主意。创建一个使用 -p 调用 rails 服务器的 rake 任务。
task "start" => :environment do
system 'rails server -p 3001'
end
然后调用rake start 而不是rails server
【讨论】:
结合之前的两个答案,对于 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端口。
我们使用 Puma 作为 Web 服务器,并使用 dotenv 在开发中设置环境变量。这意味着我可以为PORT 设置一个环境变量,并在 Puma 配置中引用它。
# .env
PORT=10524
# config/puma.rb
port ENV['PORT']
但是,您必须使用foreman start 而不是rails s 来启动您的应用,否则无法正确读取 puma 配置。
我喜欢这种方法,因为配置在开发和生产中的工作方式相同,您只需在必要时更改端口的值。
【讨论】:
灵感来自 Radek 和 Spencer... 在 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 中的所有其他配置仍然设置,命令行开关仍然覆盖默认值。
【讨论】:
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'
【讨论】:
require 'rack/handler' 之前移动 require File.dirname(__FILE__) + '/../config/boot' 才能使其工作。
如果您使用 puma(我在 Rails 6+ 上使用它):
更改所有环境的默认端口:
如果在 ENV 中未定义,则“{3000}”部分设置默认端口。
~/config/puma.rb
change:
port ENV.fetch('PORT') { 3000 }
for:
port ENV.fetch('PORT') { 10524 }
根据环境定义它,使用 Figaro gem 作为凭证/环境变量:
~/application.yml
local_db_username: your_user_name
local_db_password: your_password
PORT: 10524
您可以根据自己的环境变量管理器进行调整。
【讨论】:
您可以安装$ gem install 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
...
...
干杯
【讨论】:
在您的 shell 中为具有指定端口的命令创建别名。
【讨论】:
script/rails 中覆盖它。谢谢你。