【问题标题】:How to tell bundler to ignore gems that don't exist?如何告诉捆绑器忽略不存在的宝石?
【发布时间】:2013-05-24 19:02:34
【问题描述】:

我的组织有许多用于自动化测试的内部 gem,但不是生产部署所必需的。我正在尝试使用 Bundler,因此在我的 Gemfile 中,我将这些 gem 包装在:

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 在我告诉它时没有忽略该宝石。

【问题讨论】:

  • 发布您的Gemfiledashboard_summary 可能是其他一些 gem 的依赖项
  • 您如何指定dashboard_summary gem?您是否有多个 source 行,如果有,您如何避免内部存储库中的错误在生产中不可用?

标签: ruby-on-rails ruby bundler


【解决方案1】:

这是预期的行为。来自the docs

虽然--without 选项将跳过安装指定组中的gem,它仍会下载这些gem并使用它们来解决每个gem的依赖关系你的 Gemfile(5)。

虽然最新的 Gemfile.lock 可能表明不需要再次解析依赖项,但即使在这种情况下,似乎所有 gem 都已下载。

【讨论】:

  • 我不确定“安装”和“下载”之间的区别是什么。我以为红宝石被解释了。 bundler 是否具有可以实现我的目标的功能(即完全忽略生产中的某些 gem?)
  • 安装会将下载的 gem 包解压到适当的位置,并在必要时编译 C 扩展。这样它就在gem list,你可以require它。
【解决方案2】:

您没有定义任何包含登台、开发和测试的组。你的小组只有测试和开发。

Bundler 正在尝试忽略其中包含所有三个名称的组,因此您可以将暂存添加到

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

或者你可以使用

 $ bundle install --without test development

【讨论】:

    【解决方案3】:

    我不知道你为什么在里面有staging?但这应该工作

     bundle install --without test development
    

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

    你可以使用

    gem 'dashboard_summary', require: false
    

    这不会在启动时加载 gem,当你想使用 gem 时你必须要求它。如果您因为依赖关系而需要将dashboard_summary 保留在 Gemfile 中,这可能会有所帮助,但可以节省加载时间并且不会出现您现在遇到的错误。至少可以尝试一下。

    【讨论】:

    • 看起来 dashboard_summary 是其他 gem(s) 的依赖项。在这种情况下,你不能忽视它。
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多