2012-12-27 94 views
4

是否有可能需要具有参数/参数的文件?使用红宝石参数需要

例如

resource.rb有

mode = ARGV.first 

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

而且main.rb的要求它与一些PARAMS像

require_relative './resource.rb prod' 

如果这是不可能的,或者是不好的做法,请让我知道。我想我可以使用版本控制来切换测试和产品,但它似乎有点迟钝。

(仅用于区分督促和检验。这是一个非常轻量级的项目,如果这有什么差别:)不是商业)的Windows XP上感谢

使用Ruby 1.9.3。

我很惊讶,这已经没有答案了。只使用宝石和使用红宝石参数,但不能同时使用。

回答

6

你不能做到这一点通过要求,但你可以设置环境变量:

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

+0

很不错。并感谢链接到文章。提供一些有用的信息! – JoeyC

6

不,您无法通过require传递参数。

我建议做这样的事情:

def use_mode(mode) 
    # your if statements 
end 

然后

require 'file' 
use_mode :development 

而且包起来的类/模块更清晰的代码:)

0

首先它不会工作。通过命令的应用程序调用谎言不同于要求内部,所以没有传递给它的参数。要求是简单地读取和评估文件。 为了支持您想要的功能,您应该使用配置和类。

# 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) 
1

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

# in main.rb 
require_relative 'resource' 

# in cli 
ruby main.rb prod 
1

不,你不能要求传递参数。 但是你在需要某些东西之前先定义一个参数。

例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。然后你可以选择你需要的文件。