Make Gem :: Specification.find_by_name返回正确的gem版本

时间:2018-05-04 18:19:05

标签: ruby bundler

我有一个ruby gem(让我们称之为my_gem)暴露可执行文件(让我们称之为my_exe)。当我将gem "my_gem", "0.0.1"添加到应用程序的Gemfile并运行bundle exec my_exe时,我在调用Gem::Specification.find_by_name("my_gem")时正确获取版本0.0.1的gem规范。

我需要这个可执行文件才能在没有捆绑包的情况下工作。当我执行

my_gem _0.0.1_

并查看Gem::Specification.find_by_name("my_gem")的值,我获得了系统上最新安装的my_gem版本的规范。

如何让Gem::Specification.find_by_name返回与我传递给exectuable的值对应的gem规范?

更新

我忘了提及一条信息。我无法修改调用Gem::Specification.find_by_name("my_gem")的代码。在my_exe调用的第三方库中调用该特定代码行。 (该库是RuboCop,在这里RuboCop尝试加载规范(https://github.com/bbatsov/rubocop/blob/v0.55.0/lib/rubocop/config_loader_resolver.rb#L186)我尝试设置环境,以便Gem::Specification.find_by_name("my_gem")返回my_gem版本的规范1 {}位于$LOAD_PATH上。必须有办法实现,因为bundler能够实现它。

1 个答案:

答案 0 :(得分:1)

Gem::Specification.find_by_name("my_gem", "0.0.1")

如果找不到符合要求的规格,则会引发错误。查看https://ruby-doc.org/stdlib-2.2.3/libdoc/rubygems/rdoc/Gem/Specification.html#find_by_name-method

<强>更新

更新我的回答以响应您的更新。

你可能会更好地说明你的工作要做的更高层次。 Bundler是包管理的最佳工具,你真的不想自己做。如果您不知道自己在做什么或者如何尝试实施代码,也许您可​​以内联Bundler

require 'bundler/inline'

gemfile 
  gem 'my-gem', '0.0.1'
end

# Do my work