首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析Gemfile.lock文件的直接和间接Gems

解析Gemfile.lock文件的直接和间接Gems
EN

Stack Overflow用户
提问于 2021-07-27 16:54:23
回答 1查看 159关注 0票数 1

我试图解析以下Gemfile.lock,以包含GEM规范之外的所有GEM(直接和间接依赖项):

代码语言:javascript
复制
GEM
  remote: http://rubygems.org/
  specs:
    coderay (1.1.3)
    domain_name (0.5.20190701)
      unf (>= 0.0.5, < 1.0.0)
    http-accept (1.7.0)
    http-cookie (1.0.4)
      domain_name (~> 0.5)
    json (2.5.1)
    method_source (1.0.0)
    mime-types (3.3.1)
      mime-types-data (~> 3.2015)
    mime-types-data (3.2021.0704)
    netrc (0.11.0)
    rest-client (2.1.0)
      http-accept (>= 1.7.0, < 2.0)
      http-cookie (>= 1.0.2, < 2.0)
      mime-types (>= 1.16, < 4.0)
      netrc (~> 0.8)
    unf (0.1.4)
      unf_ext
    unf_ext (0.0.7.7)
    yaml (0.1.1)

PLATFORMS
  ruby
  x86_64-darwin-20

DEPENDENCIES
  json
  rest-client
  yaml

RUBY VERSION
   ruby 2.7.3p183

BUNDLED WITH
   2.2.23

但是,使用我的函数,我只能得到直接依赖而没有它们的间接依赖。例如:直接依赖关系: http-cookie (1.0.4)间接依赖: domain_name (~> 0.5)

我的代码:

代码语言:javascript
复制
require 'bundler'

def gemlock(file_path)
  file = file_path
  gemlock_array = []

  context = Bundler::LockfileParser.new(Bundler.read_file(file))

  # Gems
  context.specs.each do |spec|
    name = spec.name
    version = spec.version.to_s

    gemlock_array << {'name' => name, 'version' => version}
  end
  puts gemlock_array
end

gemlock('Gemfile.lock')

我得到了下面的散列:

代码语言:javascript
复制
{"name"=>"coderay", "version"=>"1.1.3"}
{"name"=>"domain_name", "version"=>"0.5.20190701"}
{"name"=>"http-accept", "version"=>"1.7.0"}
...

如您所见,间接依赖项被自动忽略!但我还是得去拿。

我对邦德勒没有任何经验,也不知道如何解决这个问题。在这件事上任何帮助都将是非常感谢的!

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-27 17:06:39

间接依赖关系自动被忽略

如果您包含了完整的输出,这会有帮助的。我自己查了一下,你得到:

代码语言:javascript
复制
[{"name"=>"coderay", "version"=>"1.1.3"},
 {"name"=>"domain_name", "version"=>"0.5.20190701"},
 {"name"=>"http-accept", "version"=>"1.7.0"},
 {"name"=>"http-cookie", "version"=>"1.0.4"},
 {"name"=>"json", "version"=>"2.5.1"},
 {"name"=>"method_source", "version"=>"1.0.0"},
 {"name"=>"mime-types", "version"=>"3.3.1"},
 {"name"=>"mime-types-data", "version"=>"3.2021.0704"},
 {"name"=>"netrc", "version"=>"0.11.0"},
 {"name"=>"rest-client", "version"=>"2.1.0"},
 {"name"=>"unf", "version"=>"0.1.4"}, # <------ !!!!!!!!!!!!
 {"name"=>"unf_ext", "version"=>"0.0.7.7"},
 {"name"=>"yaml", "version"=>"0.1.1"}]

总之,domain_name的间接依赖性,即unf,大概就是您所指的,包含在列表后面的。您的代码已经完全按照您的意愿工作了。

不过,有一点是次要的:您可以通过这样做来稍微简化实现:

代码语言:javascript
复制
gemlock_array = context.specs.map { |s| {'name' => s.name, 'version' => s.version.to_s} }

在ruby中,分配一个临时数组并在.each循环中附加到它通常是次优的。使用map来直接构造数组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68548974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档