6

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

例如

resource.rb 有

mode = ARGV.first

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

并且 main.rb 需要它带有类似的参数

require_relative './resource.rb prod'

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

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

感谢在 Windows XP 上使用 Ruby 1.9.3。

我很惊讶已经没有答案了。只有关于使用 gems 和使用带参数的 ruby​​ 的东西,但不能同时使用两者。

4

5 回答 5

9

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

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 的 12 factor 应用程序

于 2012-12-27T08:32:16.077 回答
6

不,您不能使用require.

我建议做这样的事情:

def use_mode(mode)
  # your if statements
end

进而

require 'file'
use_mode :development

并将其包装在一个类/模块中以获得更简洁的代码:)

于 2012-12-27T08:27:37.957 回答
2

不,您不能使用 require 传递参数。但是您在需要某些东西之前定义了一个参数。

示例资源.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'

另一种可能性:您定义 aresource_prod.rb和 a resource_test.rb。然后您可以选择您需要的文件。

于 2012-12-27T16:57:58.453 回答
1

require_relative 只接受文件相对于所需文件路径的相对路径名,您可以执行以下操作:

# in main.rb
require_relative 'resource'

# in cli
ruby main.rb prod
于 2012-12-27T08:40:13.600 回答
0

首先它是行不通的。通过命令 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)
于 2012-12-27T08:29:04.877 回答