Làm cách nào để thay đổi cổng mặc định của máy chủ Rails 3 trong develoment?


164

Trên máy phát triển của tôi, tôi sử dụng cổng 10524. Vì vậy, tôi khởi động máy chủ của mình theo cách này:

rails s -p 10524

Có cách nào để thay đổi cổng mặc định thành 10524 vì vậy tôi sẽ không phải nối thêm cổng mỗi khi tôi khởi động máy chủ?


1
câu trả lời đơn giản là chỉnh sửa config/puma.rbnếu chạy máy chủ puma mặc định
khaverim

Câu trả lời:


132

Đầu tiên - không chỉnh sửa bất cứ điều gì trong đường dẫn đá quý của bạn! Nó sẽ ảnh hưởng đến tất cả các dự án và bạn sẽ gặp nhiều vấn đề sau này ...

Trong dự án của bạn chỉnh sửa script/railstheo cách này:

#!/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'

Nguyên tắc rất đơn giản - bạn đang vá khỉ người chạy máy chủ - vì vậy nó sẽ ảnh hưởng đến chỉ một dự án.

CẬP NHẬT : Có, tôi biết rằng có giải pháp đơn giản hơn với tập lệnh bash chứa:

#!/bin/bash
rails server -p 10524

nhưng giải pháp này có một nhược điểm nghiêm trọng - nó nhàm chán như địa ngục.


14
Hoặc thậm chí là một bí danh! alias rs='rails server -p 10524'
trisweb

2
Hãy chắc chắn đặt require 'rails/commands'SAU những thứ mới mà bạn dán vào. Nếu không, nó vẫn sẽ thử cổng 3000.
CJBrew

không làm việc cho tôi, vẫn bắt đầu từ: 3000. Giải pháp Howver @Spencer (trên trang này) hoạt động
Roman

Làm việc trong một ví dụ cho tôi nhưng không phải là một trường hợp khác. Khi tôi phải tạo thư mục script và tập tin rails của riêng mình -> không thành công lớn. Có lẽ phải làm gì với việc đường ray có chạy khỏi tập lệnh hay không?
thiệu

@trisweb Bạn có thể giải thích cách tạoalias rs
Selvamani

131

Tôi muốn nối các phần sau vào 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
Sử dụng superthay vì hack bí danh.
Nhà sản xuất bây giờ

2
Thật không may, nếu superđược sử dụng thay vì bí danh, nó gọi phương thức sai. Nó gọi ::Rack::Serverphiên bản default_options.
mã hóaFoo

3
Với ruby ​​2.0, bạn có thể prependsử dụng một mô-đun ẩn danh thay vì sử dụng alias. Điều này cho phép sử dụng sạch super.
exbinary

2
Câu trả lời này sẽ khiến Rails::Serverđược xác định trong ngữ cảnh khi không nên (ví dụ: chạy bảng điều khiển Rails). Vì vậy, tôi khuyên bạn nên đặt mã ở cuối application.rb, bảo vệ với một if defined?(Rails::Server).
XåpplI'-I0llwlg'I -

29

Thêm một ý tưởng cho bạn. Tạo một tác vụ cào gọi máy chủ rails bằng -p.

task "start" => :environment do
  system 'rails server -p 3001'
end

sau đó gọi rake startthayrails server


16

Kết hợp hai câu trả lời trước, cho Rails 4.0.4 (và có lẽ là), điều này đủ cho phần cuối của config/boot.rb:

require 'rails/commands/server'

module Rails
  class Server
    def default_options
      super.merge({Port: 10524})
    end
  end
end

Làm cách nào tôi có thể truy xuất tùy chọn này trong ứng dụng đang chạy? Cụ thể, tôi muốn đặt config.action_mailer.default_url_options, nếu không, nó vẫn trỏ đến cổng 3000.
Joshua Muheim

Tôi đã thêm một câu hỏi liên quan đến vấn đề này tại đây: stackoverflow.com/questions/29431315/
Kẻ

7

Chúng tôi đang sử dụng Puma làm máy chủ web và dotenv để đặt các biến môi trường đang phát triển. Điều này có nghĩa là tôi có thể đặt biến môi trường cho PORTvà tham chiếu nó trong cấu hình Puma.

# .env
PORT=10524


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

Tuy nhiên, bạn sẽ phải bắt đầu ứng dụng của mình foreman startthay vìrails s , nếu không cấu hình puma không được đọc đúng cách.

Tôi thích cách tiếp cận này vì cấu hình hoạt động theo cùng một cách trong phát triển và sản xuất, bạn chỉ cần thay đổi giá trị của cổng nếu cần thiết.


4

Lấy cảm hứng từ Radek và Spencer ... Trên Rails 4 (.0.2 - Ruby 2.1.0), tôi đã có thể thêm phần này vào 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

Tất cả các cấu hình khác trong default_options vẫn được đặt và các công tắc dòng lệnh vẫn ghi đè mặc định.


3

Giải pháp cho 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'

Cảm ơn! Tôi đến đây để tìm kiếm một giải pháp với đường ray 2.3,18 :-)
Prakash Murthy

Tôi đã phải di chuyển require File.dirname(__FILE__) + '/../config/boot'trước require 'rack/handler'để nó hoạt động.
Prakash Murthy

1

Bạn có thể cài đặt $ gem install foremanvà sử dụng foreman để khởi động máy chủ của bạn như được định nghĩa trong Procfilelike của bạn :

web: bundle exec rails -p 10524

Bạn có thể kiểm tra foremantài liệu đá quý tại đây: https://github.com/ddollar/foreman để biết thêm thông tin

Lợi ích của phương pháp này không chỉ là bạn có thể dễ dàng thiết lập / thay đổi cổng trong cấu hình và nó không yêu cầu thêm mã mà còn có thể thêm các bước khác nhau trong trình Procfilequản lý sẽ chạy cho bạn để bạn không ' Không phải đi qua chúng mỗi khi bạn muốn bắt đầu ứng dụng một cái gì đó như:

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

Chúc mừng


-4

Tạo bí danh trong shell của bạn để ra lệnh với một cổng được chỉ định.


12
chỉnh sửa tập tin trong đường dẫn đá quý của bạn là ... tốt, chỉ dành cho người dũng cảm nhất. Nó sẽ không tồn tại các bản cập nhật đá quý, nó sẽ không hoạt động trên nhiều máy tính hơn, v.v. Tôi thực sự không khuyên dùng nó
Radek Paviensky

2
Bạn đúng rồi. Giải pháp của bạn tốt hơn nhiều. Tôi không biết rằng tôi có thể ghi đè lên script/rails. Cảm ơn vì điều đó.
thường
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.