Ruby 如何让集束器考虑本地宝石作为“?”“已安装”吗;?

Ruby 如何让集束器考虑本地宝石作为“?”“已安装”吗;?,ruby,bundler,Ruby,Bundler,我正在同时开发两颗红宝石,其中一颗取决于另一颗。说我的宝石名字是“foo”和“bar”。“bar”依赖于“foo”,因此其gemspec包括: s.add_runtime_dependency "foo", "~> 0" # More dependencies... 和我的档案: source "https://rubygems.org" gemspec 当然,现在运行bundle install会给我一个错误,因为“foo”放在本地文件夹中 我不想注释掉依赖项行,也不想将其指向本地

我正在同时开发两颗红宝石,其中一颗取决于另一颗。说我的宝石名字是“foo”和“bar”。“bar”依赖于“foo”,因此其gemspec包括:

s.add_runtime_dependency "foo", "~> 0"
# More dependencies...
和我的档案:

source "https://rubygems.org"

gemspec
当然,现在运行
bundle install
会给我一个错误,因为“foo”放在本地文件夹中

我不想注释掉依赖项行,也不想将其指向本地文件夹,因为这将是一个本地更改,我永远不会提交给Git repo。它会占用git status下的空间,并且会妨碍我修改文件


我希望有一些技巧,我可以做一些环境变量,让Bundler知道“foo”在哪里,并计算为“已安装”。这可能吗?

这个技巧是使用bundler完成的

假设gemfoo依赖于gembar。然后在foo的Gemfile中,使用bundler的path选项指向gem栏:

然后
bundle安装

之后,诸如
bundle exec rspec
bundle exec rake features
等命令将使用本地文件夹中的gem“bar”

完成后,将Gemfile中的
gem“bar”
行恢复为其正常形式


如果要永久保留文件修改,您有几个选项。一种是只需将其与修改一起签入即可。根据,Bundler将首先尝试从本地路径加载gem,然后返回到从全局源安装gem

如果gem是公开的,您的本地修改可能会让克隆您的gem的人感到困惑。在这种情况下,由于Gemfile只是ruby代码,因此您可以使用环境变量来启用位置修改:

# When making concurrent modifications to gem "bar",
# use that gem by its local directory.
if ENV['BAR_GEM_PATH']
  gem "bar", path: ENV['BAR_GEM_PATH']
end

你不能在里面做。gempec,请按照下面的代码来做

gem 'gem_name', path: 'full/path/to/your_gem'

在我的经验中,同时开发两个gem是最好的方法,如果你将一个gem上传到rubygems.org,你可以使用
s.add\u runtime\u dependency“foo”、“~>0”
,但是如果你想更改gem“foo”代码,并在另一个项目中升级,你需要再次运行
bundle install
。这样做非常浪费时间。

这很好,但这仍然意味着我必须进行我永远不会承诺的本地修改,这是我希望避免的。如果我同意的话,我可以完全删除“foo”行,那么bundler在安装依赖项时就不会抱怨了。在我的问题中详细阐述了一点。好吧,这个问题有点错误。实际上,我不必删除
路径:
选项,我可以安全地提交它。根据,Bundler将首先尝试从本地路径加载gem,然后返回到从全局源安装gem。您可能应该将其编辑到您的答案中。@Hubro很高兴知道。不过,我不想推荐它:我认为发布对Gemfile的本地临时修改是不好的,但这并不完全是临时的。这可能是整个项目生命周期都需要的。是的,这不是一个可行的解决方案。在我工作的时候,项目“bar”必须总是有最新的开发版本的“foo”,所以为每个小文件更改发布gem是不可能的。
gem 'gem_name', path: 'full/path/to/your_gem'