如何让Bundler将本地宝石视为"已安装"?

时间:2014-10-23 10:38:06

标签: ruby bundler

我同时开发了两个Ruby宝石,其中一个取决于另一个宝石。说我的宝石名字是" foo" &" bar"。 "杆"取决于" foo",所以它的gemspec包括:

s.add_runtime_dependency "foo", "~> 0"
# More dependencies...

我的Gemfile:

source "https://rubygems.org"

gemspec

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

我不想注释掉依赖项,也不想将它指向本地文件夹,因为这将是一个本地更改,我永远不会提交给我Git回购。这会占用git status下的空间,当我需要对文件进行修改时,它会受到阻碍。

我希望我能用一些环境变量做一些技巧,让Bundler知道" foo"是,并计为"已安装"。这可能吗?

2 个答案:

答案 0 :(得分:1)

这个技巧是使用bundler完成的。

让我们说gem foo 取决于gem bar 。然后在foo的Gemfile中,使用bundler&#39> 路径选项指向gem bar

gem "bar", path: "/home/wayne/lab/bar"

然后bundle install

之后,bundle exec rspecbundle exec rake features等命令将使用gem" bar"超出您的本地文件夹。

完成后,将Gemfile中的gem "bar"行恢复为正常格式。


如果要永久保留Gemfile修改,您有几个选项。一个是通过修改来检查它。根据{{​​3}},Bundler将首先尝试从本地路径加载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

答案 1 :(得分:0)

您无法在.gemspec中执行此操作,请将其设置为以下代码

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

在我的exp中,它是同时开发两个gem的最佳方式,如果你将一个gem上传到rubygems.org,你可以使用s.add_runtime_dependency "foo", "~> 0",但如果你想改变gem&#34 ; FOO"代码,并在另一个项目中更新,您需要再次运行bundle install。这样做非常浪费时间。