использование параметров с ruby ​​требует

Можно ли требовать файлы с аргументами/параметрами?

Например

В ресурсе.rb есть

mode = ARGV.first

if mode == "prod"
  #use prod db
else
  #use test db
end

И main.rb требует его с параметрами с чем-то вроде

require_relative './resource.rb prod'

Если это невозможно или является плохой практикой, пожалуйста, дайте мне знать. Думаю, я мог бы использовать контроль версий для переключения между тестом и продуктом, но это кажется немного заторможенным.

(prod и test используются только для того, чтобы различать. Это довольно легкий проект и не является коммерческим, если это имеет какое-либо значение :))

Спасибо за использование Ruby 1.9.3 в Windows XP.

Я удивлен, что на это уже не было ответов. Только материал об использовании драгоценных камней и использовании рубина с параметрами, но не о том и другом одновременно.


person JoeyC    schedule 27.12.2012    source источник


Ответы (5)


Вы не можете сделать это через требование, но вы можете установить переменную среды:

In main.rb:

ENV["mode"] = ARGV.first
require_relative './resource'

In ./resource.rb:

mode = ENV.fetch("mode")

if mode == "prod"
  #use prod db
else
  #use test db
end

Преимущество использования переменных среды для конфигураций заключается в том, что вы можете иметь одну и ту же логику в нескольких файлах. Это способ ведения дел Heroku.

См. 12-факторное приложение Heroku.

person Jean-Louis Giordano    schedule 27.12.2012
comment
очень хорошо. и спасибо за ссылку на статью. Даёт полезную информацию! - person JoeyC; 31.12.2012

Нет, вы не можете передавать параметры с помощью require.

Я бы предложил сделать что-то вроде этого:

def use_mode(mode)
  # your if statements
end

а потом

require 'file'
use_mode :development

И заверните его в класс/модуль для более чистого кода :)

person Dogbert    schedule 27.12.2012

Нет, вы не можете передавать параметры с помощью require. Но вы определяете параметр, прежде чем что-то требовать.

Пример ressource.rb:

RESOURCE_MODE = :prod unless defined? RESOURCE_MODE
case RESOURCE_MODE
  when :prod
    #your productive settings
  when :test
    #your test settings
  else
    raise ArgumentError
end

Когда вы называете это с помощью require 'resource', вы работаете продуктивно.

Когда вы вызываете его в тестовом режиме, вы можете использовать:

RESOURCE_MODE = :test
require 'resource'

Другая возможность: вы определяете resource_prod.rb и resource_test.rb. Затем вы можете выбрать, какой файл вам нужен.

person knut    schedule 27.12.2012

require_relative принимает только относительный путь к файлу относительно требуемого пути к файлу, вы можете сделать что-то вроде этого:

# in main.rb
require_relative 'resource'

# in cli
ruby main.rb prod
person megayu    schedule 27.12.2012

Во-первых, это не сработает. Вызов приложения с помощью команды lie отличается от внутренних функций require, поэтому ему не передаются никакие параметры. В двух словах требуется прочитать и оценить файл. Чтобы поддерживать функциональность, которую вы хотите, вы должны использовать конфигурацию и классы.

# resource.rb
class DB
  def initialize(db_config ={})
    #connect to db
  end
end

# main.rb
connection = DB.new(mode == "prod" ? prod_db_config : development_db_config)
person Sigurd    schedule 27.12.2012