使用Bundler解析Gemfile.lock

时间:2016-08-06 02:57:59

标签: ruby api rubygems bundler

基本上,我正在尝试构建一个gem,当某些依赖项过时时,它会执行某种形式的测试失败。在测试框架中,我可以轻松地从Gem中删除废话,以便Gem.loaded_specs(“foo”)返回gem foo的规范。我正在寻找的是一种提供夹具Gemfile然后解析锁文件的方法。

当我使用Gem.loaded_specs时,它神奇地知道要使用哪个Gemfile,如何为它提供不同的gemfile(即:我的灯具)?

我知道有人提到“使用捆绑器”并且这是有道理的但是在我的代码中我做了这个:

gem_here = Gem.loaded_specs[gem_name]
gem_here.nil? ? :not_in_bundle : gem_here.version.to_s

我需要使用我的fixture Gemfile而不是当前的项目gemfile。

这有什么意义吗?对不起,如果这是模糊的。

注意:我不是试图通过CLI执行此操作。如果可以的话,我想使用编程(即:ruby api)方法。

编辑:

我现在正在使用这种来源:

gem_here = Bundler.load.specs.detect do |specs|
  specs.name == gem_name
end
gem_here.nil? ? :not_in_bundle : gem_here.version.to_s

1 个答案:

答案 0 :(得分:4)

解析自己是不可取的,因为Bundler做了繁重的工作(解析,依赖解析)。

Bundler::LockfileParser.new(Bundler.read_file(Bundler.default_lockfile))

然后,使用gemspecs和lockfile访问所有运行时和/或开发依赖项。特定gem的运行时/开发代表可以通过(当前未记录的,需要的贡献)RubyGems JSON API https://api.rubygems.org/api/v2/rubygems/rails/versions/5.0.0.1.json

获得。

注意: Bundler 2.0 Gemfile.lock - > gems.locked