如何在开发中更改Rails 3服务器的默认端口?


164

在开发计算机上,我使用端口10524。因此,我以这种方式启动服务器:

rails s -p 10524

有没有办法将默认端口更改为10524,这样我就不必在每次启动服务器时都附加端口?


1
config/puma.rb如果运行默认的彪马服务器,则简单的答案是编辑
khaverim 18/12/21

Answers:


132

首先-不要在您的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

但是此解决方案有一个严重的缺点-很无聊。


14
甚至是别名!alias rs='rails server -p 10524'
trisweb 2013年

2
确保在require 'rails/commands'粘贴新内容之后放进去。否则它将仍然尝试使用端口
3000。– CJBrew

对我不起作用,仍然从:3000开始。但是,@ Spencer解决方案(在此页上)如何工作
罗马

在一个实例中为我工作,但在另一个实例中却没有。当我不得不创建自己的脚本文件夹和rails文件时->效果不佳。可能与rails是否在脚本中运行无关?
加尔斯(Gards)2014年

@trisweb您能解释一下如何创建alias rs

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代替别名hack。
Nowaker

2
不幸的是,如果super使用它代替别名,则会调用错误的方法。它调用::Rack::Serverdefault_options 的版本。
codingFoo

3
使用ruby 2.0,您可以prepend使用匿名模块,而不是使用alias。这样可以干净地使用super
2013年

2
该答案将导致Rails::Server在不应该使用的上下文中被定义(例如,运行Rails控制台)。因此,我建议将代码放在末尾application.rb,并以加以保护if defined?(Rails::Server)
XåpplI'-I0llwlg'I -

29

还有一个想法给您。创建一个rake任务,该任务使用-p调用rails服务器。

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
约书亚Muheim

我在这里添加了与此相关的问题:stackoverflow.com/questions/29431315/…–
约书亚·穆海姆

7

我们将Puma用作Web服务器,并使用dotenv在开发中设置环境变量。这意味着我可以为设置环境变量PORT,并在Puma配置中引用它。

# .env
PORT=10524


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

但是,您必须使用来启动您的应用,foreman start而不是rails s,否则无法正确读取puma配置。

我喜欢这种方法,因为配置在开发和生产中的工作方式相同,您只需要在必要时更改端口的值即可。


4

受Radek和Spe​​ncer的启发...在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中的所有其他配置仍会设置,并且命令行开关仍会覆盖默认值。


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'

谢谢!我来这里寻求使用Rails 2.3.18的解决方案:-)
Prakash Murthy 2014年

我确实必须先移动require File.dirname(__FILE__) + '/../config/boot'之前require 'rack/handler'才能工作。
Prakash Murthy 2014年

1

您可以安装$ gem install foreman,并使用领班按照您的方式启动服务器Procfile

web: bundle exec rails -p 10524

您可以在以下位置查看foremangem文档:https//github.com/ddollar/foreman了解更多信息

这种方法的好处不仅在于您可以轻松地在配置中设置/更改端口,并且不需要添加太多代码,而且还可以添加其他步骤,Procfile使领班为您运行,因此您无需每次您要启动应用程序时都不必遍历它们,例如:

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

干杯


-4

在外壳程序中为具有指定端口的命令创建别名。


12
在您的gem路径中编辑文件是...很好,仅适用于最勇敢的人。它无法在gem更新中幸存下来,无法在更多计算机上运行,​​等等。我真的不推荐这样做
Radek Paviensky 2010年

2
你是对的。您的解决方案要好得多。我不知道可以在中覆盖它script/rails。感谢那。
Casual Coder 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.