Bundler:存在时使用共享gem,而不是从gem服务器下载

时间:2015-01-21 04:08:40

标签: ruby gem rubygems bundler gemfile

说,我有Gemfile,如下所示。

source "GEM_REPOSITORY"

gem 'gem_A'
# gem_A has no additional dependency

gem 'gem_B'
# gem_B depends on gem_B_1 and gem_B_2

当我运行bundle install时,我希望Bundler执行以下操作。

  1. 如果某个宝石已存在于"本地系统范围的宝石"中,它会从本地复制宝石。

  2. 如果某个宝石不存在于本地,它会查找GEM_REPOSITORY。

  3. 我找了一些相关文章,发现了一些可能的答案,比如

    但以上都不是我的答案。 使用源存储库优先级不起作用。因为在上面的示例中,如果依赖gem(例如,gem_B_1)在本地退出但目标gem(gem_B)不存在于本地,它将下载以上两者来自远程存储库。

    有没有做这件事的工作? 如果没有,那么你们认为考虑到实施成本和影响是否必要?

1 个答案:

答案 0 :(得分:1)

这是当前的行为。 直接或通过gem install运行bundle install时,gem将首先构建包含所有所需宝石的依赖关系图。如果在本地找到gem,它将使用它,否则它将尝试从指定的源下载它。

如果您愿意,请亲自尝试。

bundle gem gem_a
bundle gem gem_b
cd gem_a
vim gem_a.gemspec

添加

spec.add_dependency 'multi_json', '~> 1.10.1'

或您想要的任何依赖关系并运行bundle install。

cd ../gem_b
vim Gemfile

并添加

gem 'gem_a', path: '../gem_a'

然后运行

bundle install --verbose

您会看到multi_jsongem_a的任何依赖项使用本地版本而不下载任何内容。

对于远程来源的宝石来说当然也是如此。