使用ruby要求的参数

时间:2012-12-27 08:21:44

标签: ruby parameters arguments require

是否可以要求带参数/参数的文件?

例如

resource.rb有

mode = ARGV.first

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

而main.rb需要使用带有类似

之类的参数
require_relative './resource.rb prod'

如果这是不可能或不好的做法,请告诉我。我想我可以使用版本控制在测试和产品之间切换,但似乎有点迟钝。

(prod和test仅用于区分。这是一个非常轻量级的项目,如果它有任何区别,则不是商业用途:))

在Windows XP上使用Ruby 1.9.3谢谢。

我很惊讶这个问题已经没有答案了。只有使用宝石和使用ruby参数但不能同时使用两者的东西。

5 个答案:

答案 0 :(得分:7)

您无法通过require执行此操作,但您可以设置环境变量:

main.rb

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

./resource.rb

mode = ENV.fetch("mode")

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

使用环境变量进行配置的优点是可以在多个文件中使用相同的逻辑。这就是Heroku的做事方式。

请参阅Heroku's 12 factor app

答案 1 :(得分:6)

不,您无法使用require传递参数。

我建议做这样的事情:

def use_mode(mode)
  # your if statements
end

然后

require 'file'
use_mode :development

将其封装在Class / Module中以获得更清晰的代码:)

答案 2 :(得分:1)

require_relative只接受文件相对于需求文件路径的相对路径名,你可以这样做:

# in main.rb
require_relative 'resource'

# in cli
ruby main.rb prod

答案 3 :(得分:1)

不,您无法使用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.rbresource_test.rb。然后你可以选择你需要的文件。

答案 4 :(得分:0)

首先,它不会起作用。通过命令谎言的app调用与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)