如何告诉Bundler忽略不存在的gem?

6

我的组织有一些内部宝石,用于自动化测试,但在生产部署中不需要。我正在尝试使用Bundler,在我的Gemfile中用以下方式包装这些宝石:

group :test, :development do
    gem 'dashboard_summary'
end

然而,当我运行时:
$ bundle install --without staging development test

我仍然收到

Could not find gem 'dashboard_summary (>= 0) ruby' in the gems available on this machine.

我正在尝试理解为什么Bundler没有忽略我已经告诉它要忽略的那个gem。

发布你的 Gemfiledashboard_summary 可能是其他 gem 的依赖项。 - draxxxeus
你是如何指定 dashboard_summary gem 的?如果有多个 source 行,你是如何避免在生产环境中无法使用内部存储库而导致的错误? - matt
3个回答

5
这是预期的行为。根据文档
虽然--without选项将跳过安装指定组中的宝石,但它仍会下载那些宝石并用于解决您Gemfile(5)中每个宝石的依赖项。
即使有最新的Gemfile.lock,看起来所有宝石都会被下载。

我不确定“安装”和“下载”的区别是什么。我以为 Ruby 是解释执行的。Bundler 有没有一项功能可以实现我的目标(即在生产环境中完全忽略某些 gem)? - spierepf
安装将把下载的 gem 包提取到适当的位置并编译 C 扩展(如果需要)。这样它就在 gem list 中,你可以使用 require 引用它。 - Simon Perepelitsa

3

您没有定义包含staging、development和test的任何组。您的组只有test和development。

Bundler试图忽略一个包含所有三个名称的组,因此您可以将staging添加到

group :test, :development, :staging do
    gem 'dashboard_summary'
end

或者您可以使用。
 $ bundle install --without test development

2
我不确定为什么你写了staging,但是这应该可以工作。
 bundle install --without test development

您还可以在bundle config中设置文档中记录的BUNDLE_WITHOUT配置环境变量。

您可以使用

gem 'dashboard_summary', require: false

这样做不会在启动时加载 gem,只有在需要使用 gem 时才需要 require。如果你因为依赖关系而需要在 Gemfile 中保留 dashboard_summary,但又想节省加载时间并避免现在出现的错误,那么这可能会有所帮助。至少可以尝试一下。


看起来 dashboard_summary 是其他 gem 的依赖项。在这种情况下,您不能忽略它。 - fontno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接