บนเครื่องพัฒนาของฉันฉันใช้พอร์ต 10524 ดังนั้นฉันจึงเริ่มเซิร์ฟเวอร์ด้วยวิธีนี้:
rails s -p 10524
มีวิธีการเปลี่ยนพอร์ตเริ่มต้นเป็น 10524 ดังนั้นฉันไม่ต้องผนวกพอร์ตทุกครั้งที่ฉันเริ่มเซิร์ฟเวอร์หรือไม่
บนเครื่องพัฒนาของฉันฉันใช้พอร์ต 10524 ดังนั้นฉันจึงเริ่มเซิร์ฟเวอร์ด้วยวิธีนี้:
rails s -p 10524
มีวิธีการเปลี่ยนพอร์ตเริ่มต้นเป็น 10524 ดังนั้นฉันไม่ต้องผนวกพอร์ตทุกครั้งที่ฉันเริ่มเซิร์ฟเวอร์หรือไม่
คำตอบ:
ก่อนอื่น - อย่าแก้ไขอะไรในเส้นทางอัญมณีของคุณ! มันจะมีผลกับทุกโครงการและคุณจะมีปัญหามากมายในภายหลัง ...
ในโครงการของคุณแก้ไข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
แต่วิธีนี้มีข้อเสียเปรียบร้ายแรง - มันน่าเบื่อเหมือนตกนรก
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
แทนนามแฝงแฮ็ค
super
ใช้แทนนามแฝงมันจะเรียกวิธีการที่ไม่ถูกต้อง เรียก::Rack::Server
เวอร์ชันของ default_options
prepend
นี้จะช่วยให้การใช้งานที่สะอาดalias
super
Rails::Server
การกำหนดไว้ในบริบทเมื่อไม่ควรเป็น (เช่นการเรียกใช้คอนโซล Rails) ดังนั้นผมจึงขอแนะนำให้ใส่รหัสในตอนท้ายของเตรียมพร้อมกับapplication.rb
if defined?(Rails::Server)
อีกหนึ่งแนวคิดสำหรับคุณ สร้างงานเรคที่เรียกใช้เซิร์ฟเวอร์ rails ด้วย -p
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 เป็นเว็บเซิร์ฟเวอร์และ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 File.dirname(__FILE__) + '/../config/boot'
ก่อนrequire 'rack/handler'
เพื่อให้การทำงาน
คุณสามารถติดตั้ง$ 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
...
...
ไชโย
สร้างนามแฝงในเชลล์ของคุณสำหรับคำสั่งด้วยพอร์ตที่ระบุ
script/rails
ได้ ขอบคุณสำหรับสิ่งนั้น
config/puma.rb
หากใช้เซิร์ฟเวอร์ puma ที่เป็นค่าเริ่มต้น