gpt4 book ai didi

ruby - 以编程方式确定是否安装了某个 gem,如果没有则安装它

转载 作者:数据小太阳 更新时间:2023-10-29 06:30:42 25 4
gpt4 key购买 nike

这看起来并不难。

我想要一个 ruby​​ 脚本来判断某个 gem(任何版本,和/或某个版本规范)当前是否安装在系统上(无论 gem list 在哪里),如果没有,安装它。

是的,我知道在某些情况下, bundler 在这方面做得很好。相信我,我有一个案例,出于奇怪的原因我不想使用 bundler 。我真的很想以编程方式询问本地的 gem repo。

当然,一种以编程方式安装的方法就是将 shell out 到 gem install

但我无法找到一种可靠的方法来以编程方式询问 以查看是否安装了特定的 gem,而不是使用 shell out,不是使用 ruby​​gem api,什么都不是。

我错过了吗?

最佳答案

# The version requirements are optional.
# You can also specify multiple version requirements, just append more at the end
gem_name, *gem_ver_reqs = 'json', '~> 1.8.0'
gdep = Gem::Dependency.new(gem_name, *gem_ver_reqs)
# find latest that satisifies
found_gspec = gdep.matching_specs.max_by(&:version)
# instead of using Gem::Dependency, you can also do:
# Gem::Specification.find_all_by_name(gem_name, *gem_ver_reqs)

if found_gspec
puts "Requirement '#{gdep}' already satisfied by #{found_gspec.name}-#{found_gspec.version}"
else
puts "Requirement '#{gdep}' not satisfied; installing..."
# reqs_string will be in the format: "> 1.0, < 1.2"
reqs_string = gdep.requirements_list.join(', ')
# multi-arg is safer, to avoid injection attacks
system('gem', 'install', gem_name, '-v', reqs_string)
end

较新的 ruby​​gems 版本提供了一个安装程序 API,因此除了使用 gem 命令外,您还可以使用:

# using the same "gdep" variable as above
Gem.install gem_name, gdep.requirement

但是,我不确定 Gem.install 是否尊重您的 .gemrc 文件。

有很多有用的方法可以查询您安装的 gem(参见 rdocs)。一些可能有帮助的内容:

  • Gem::Specification.find_all_by_name
  • Gem::Requirement#satisfied_by?(gem_version_instance)
  • Gem::Specification#satisfies_requirement?(gem_dependency_instance)
  • Gem.loaded_specs - 您通过 gem 方法或通过 require
  • 实际加载的 gem 的哈希值

关于ruby - 以编程方式确定是否安装了某个 gem,如果没有则安装它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10823594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com