Gemspec:如何指定不必自动要求的依赖项?

时间:2012-10-09 07:43:20

标签: ruby-on-rails gem gemspecs

我写了一个带有某些依赖项的gem,其中一些我想在捆绑到另一个项目时不需要隐式。一个例子是uuidtools gem,我只想在使用它的文件中要求它。

gem.add_dependency("uuidtools",["=2.1.3"], :require => false)

此语法为false,因为:require =>错误是出乎意料的,但这或多或少总结了我想用它做什么。有人可以帮我吗?

2 个答案:

答案 0 :(得分:12)

默认情况下,引擎gemspec文件中指定的gem已经需要明确要求。来自official documentation - Note that if you want to immediately require dependencies when the engine is required, you should require them before the engine's initialization。在您的情况下,您应该可以在gemspec文件中使用gem.add_dependency 'uuidtools', '2.1.3'之类的内容,并且需要在相关位置。

答案 1 :(得分:0)

我认为完成你要求的方法是不要把它放在你的gemspec中,而是为bundler添加一个Gemfile。然后你可以将它添加为捆绑安装的gem。

为此,在Gemfile的顶部或源声明之后添加简单的单词“gemspec”。这将获取gemspec特定的宝石。这基本上不是好设计。看起来更像是熵,你应该尽可能避免使用宝石和源代码。话虽如此,我认为没有任何损害安装宝石并让它需要。它应该被正确命名,并且不会干扰其他任何事情。

鉴于您引用的宝石。你甚至可能不再需要那颗宝石了。你是Ruby 1.9吗?如果是这样,现在Ruby中已经内置了SecureRandom模块。

require 'secure_random'

my_uuid = SecureRandom.uuid

你也可以用它生成一个真正的UUID!因此,您的DBA会很高兴并且可以在Postgres中使用UUID数据类型。 (你正在使用postgres,对吧!哈哈)。同样IIRC,UUIDTools根据标准不生成适当的UUID。我相信第三个序列是错误的。