จะเปลี่ยนพอร์ตเริ่มต้นของเซิร์ฟเวอร์ Rails 3 เป็น develoment ได้อย่างไร


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 script ที่มี:

#!/bin/bash
rails server -p 10524

แต่วิธีนี้มีข้อเสียเปรียบร้ายแรง - มันน่าเบื่อเหมือนตกนรก


14
หรือแม้แต่นามแฝง! alias rs='rails server -p 10524'
trisweb

2
อย่าลืมใส่require 'rails/commands'สิ่งใหม่ที่คุณวางไว้หลังมิฉะนั้นมันจะลองพอร์ต 3000
CJBrew

ใช้งานไม่ได้สำหรับฉัน แต่เริ่มต้นที่: 3000 วิธีแก้ปัญหาของ Howver @Spencer (ในหน้านี้)
โรมัน

ทำงานในอินสแตนซ์เดียวสำหรับฉัน แต่ไม่ใช่อีกอัน เมื่อฉันต้องสร้างโฟลเดอร์สคริปต์และไฟล์ Rails -> ไม่ประสบความสำเร็จ อาจเป็นเรื่องเกี่ยวกับรางไม่ว่าสคริปต์จะหมดหรือไม่?
การ์ด

@trisweb คุณช่วยอธิบายวิธีการสร้างได้อย่างไรalias rs
Selvamani

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
codingFoo

3
ด้วยทับทิม 2.0 คุณสามารถโมดูลที่ไม่ระบุชื่อแทนการใช้prepend นี้จะช่วยให้การใช้งานที่สะอาดalias super
exbinary

2
คำตอบนี้จะทำให้มีRails::Serverการกำหนดไว้ในบริบทเมื่อไม่ควรเป็น (เช่นการเรียกใช้คอนโซล Rails) ดังนั้นผมจึงขอแนะนำให้ใส่รหัสในตอนท้ายของเตรียมพร้อมกับapplication.rb if defined?(Rails::Server)
XåpplI'-I0llwlg'I -

29

อีกหนึ่งแนวคิดสำหรับคุณ สร้างงานเรคที่เรียกใช้เซิร์ฟเวอร์ rails ด้วย -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
Joshua Muheim

ฉันได้เพิ่มคำถามที่เกี่ยวข้องกับสิ่งนี้ที่นี่: stackoverflow.com/questions/29431315/…
Joshua 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

โซลูชันสำหรับ 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'

ขอบคุณ! ฉันมาที่นี่เพื่อค้นหาวิธีแก้ปัญหาด้วยราง 2.3.18 :-)
Prakash Murthy

ฉันต้องย้ายrequire File.dirname(__FILE__) + '/../config/boot'ก่อนrequire 'rack/handler'เพื่อให้การทำงาน
Prakash Murthy

1

คุณสามารถติดตั้ง$ gem install foremanและใช้โฟร์แมนเพื่อเริ่มต้นเซิร์ฟเวอร์ของคุณตามที่กำหนดไว้ในสิ่งที่คุณProcfileชอบ:

web: bundle exec rails -p 10524

คุณสามารถตรวจสอบforemanเอกสารอัญมณีที่นี่: https://github.com/ddollar/foremanสำหรับข้อมูลเพิ่มเติม

ประโยชน์ของวิธีนี้ไม่เพียง แต่คุณสามารถตั้งค่า / เปลี่ยนพอร์ตในการกำหนดค่าได้อย่างง่ายดายและไม่ต้องใช้รหัสมากนักในการเพิ่ม แต่คุณสามารถเพิ่มขั้นตอนต่าง ๆ ในProcfileหัวหน้าคนงานที่จะทำงานให้คุณเพื่อคุณ ไม่จำเป็นต้องไปถึงมันในแต่ละครั้งที่คุณต้องการเริ่มต้นแอปพลิเคชันของคุณเช่น:

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

ไชโย


-4

สร้างนามแฝงในเชลล์ของคุณสำหรับคำสั่งด้วยพอร์ตที่ระบุ


12
การแก้ไขไฟล์ในเส้นทางอัญมณีของคุณคือ ... ดีเพียงเพื่อความกล้าหาญ มันจะไม่รอดการอัปเดตอัญมณีมันจะไม่ทำงานบนคอมพิวเตอร์มากขึ้น ฯลฯ ฉันไม่อยากจะแนะนำ
Radek Paviensky

2
คุณพูดถูก ทางออกของคุณดีขึ้นมาก ฉันไม่รู้ว่าฉันสามารถลบล้างมันscript/railsได้ ขอบคุณสำหรับสิ่งนั้น
Coder ชั่วคราว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.