是否可以要求带参数/参数的文件?
例如
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参数但不能同时使用两者的东西。
答案 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的做事方式。
答案 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.rb
和resource_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)