Як змінити порт за замовчуванням на сервері Rails 3?


164

На своїй машині розробки я використовую порт 10524. Отже, я запускаю сервер таким чином:

rails s -p 10524

Чи є спосіб змінити порт за замовчуванням на 10524, щоб мені не довелося додавати порт щоразу при запуску сервера?


1
проста відповідь - це редагування, config/puma.rbякщо працює сервер puma за замовчуванням
khaverim,

Відповіді:


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. Як працює рішення Howver @Spencer (на цій сторінці)
Роман

Працював в одному випадку для мене, але не в іншому. Коли мені довелося створити власну папку скриптів і файл рейлів -> не великий успіх. Напевно, це пов’язано з тим, чи закінчується рельєф сценарію чи ні?
gards

@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замість псевдоніма хак.
Nowaker

2
На жаль, якщо superвін використовується замість псевдоніму, він називає неправильний метод. Він викликає ::Rack::Serverверсію default_options.
кодуванняFoo

3
З рубіном 2.0 ви можете prependанонімний модуль замість використання alias. Це дозволяє чисто використовувати super.
exbinary

2
Ця відповідь призведе Rails::Serverдо визначення в контекстах, коли цього не повинно бути (наприклад, запуск консолі Rails). Тому я рекомендую поставити код у кінці application.rb, захищеному знаком if defined?(Rails::Server).
XåpplI'-I0llwlg'I -

29

Ще одна ідея для вас. Створіть завдання рейку, яке викликає рейловий сервер за допомогою -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 / ...
Джошуа Muheim

7

Ми використовуємо Puma як веб-сервер, а dotenv встановлюємо змінні середовища в розробці. Це означає, що я можу встановити змінну середовища для PORTта посилатися на неї в конфігурації Puma.

# .env
PORT=10524


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

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

Мені подобається такий підхід, оскільки конфігурація працює однаково в розробці та виробництві, ви просто змінюєте значення порту, якщо потрібно.


4

Натхненний 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 все ще встановлені, а перемикачі командного рядка все ще перекривають значення за замовчуванням.


3

Рішення для рейок 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'

Дякую! Я прийшов сюди шукати рішення з рейками 2.3.18 :-)
Пракаш Мерті

Мені довелося перенести require File.dirname(__FILE__) + '/../config/boot'попереднє, require 'rack/handler'щоб воно працювало.
Пракаш Мерті

1

Ви можете встановити $ 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
...
...

Ура


-4

Створіть псевдонім у своїй оболонці для команди із вказаним портом.


12
редагування файлів на вашому дорогоцінному шляху - це ... ну, лише для найсміливіших. Він не переживе оновлення дорогоцінних каменів, він не працюватиме на більшості комп'ютерів тощо. Я дійсно не рекомендував би це
Радек Павієнський

2
Ти правий. Ваше рішення набагато краще. Я не знав, що можу це перекрити script/rails. Дякую за це.
Повсякденний кодер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.