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

Bundler: using shared gem when it exists, rather than downloading from gem server

说,我有如下的 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. 如果 gem 已经存在于 "local system-wide gems",它从本地复制 gem。

  2. 如果本地不存在gem,则查找GEM_REPOSITORY.

我查找了一些相关文章,找到了一些可能的答案,例如

但是上面的 none 看起来像是我的答案。 使用源存储库优先级不起作用。因为在上面的例子中,如果依赖gem(比如gem_B_1)在本地存在但是目标gem(gem_B)在本地不存在,它会从远程存储库下载以上两个。

是否有解决此问题的方法? 如果没有,你们不觉得有必要考虑一下实施的成本和效果吗?

这是当前行为。 当 运行ning gem install 时,直接或通过 bundle installgem 将首先构建一个包含所有需要的 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'

或您想要 gem 和 运行 捆绑包安装的任何依赖项。

cd ../gem_b
vim Gemfile

并添加

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

然后 运行

bundle install --verbose

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

这当然也适用于来自远程源的 gems。