如何检查已安装的 Ruby gem 的所有依赖项是不是满足?

Posted

技术标签:

【中文标题】如何检查已安装的 Ruby gem 的所有依赖项是不是满足?【英文标题】:How do I check that all the dependencies of my installed Ruby gems are satisfied?如何检查已安装的 Ruby gem 的所有依赖项是否满足? 【发布时间】:2011-05-07 04:36:13 【问题描述】:

我一定是错过了什么,因为昨晚我惊讶地发现在谷歌上搜索 check gem dependencies 和类似的东西并没有找到答案。

我基本上是在大致相当于rpm -V - 一个命令将遍历我安装的部分或全部gem,并确保它们的依赖项也已安装。由于gem install 默认安装任何依赖的gem,通常这不是必需的;但是,如果您 gem uninstall 一个 gem 并告诉它继续卸载,即使其他 gem 依赖于正在卸载的 gem,那么显然您最终会遇到依赖关系损坏。问题是,如何在不安装/卸载/更新任何 gem 的情况下列出那些损坏的依赖项?

注意涉及 Bundler 的答案对我来说用处不大,因为由于各种原因我仍然停留在 Rails 2.x 上。

【问题讨论】:

【参考方案1】:

我绝对同意将应用程序切换到 Bundler。如果您碰巧正在明确寻找一种方法来快速识别系统上已安装 gem 的未满足的 gem 依赖项(就像我一样),那么您可以试试这个脚本。

https://gist.github.com/1124953

【讨论】:

【参考方案2】:

在 bash 外壳中:

gem list --no-version > list
gem dependency --pipe > depends
grep -v -f list depends > failed.txt
rm list
rm depends

failed.txt 现在将列出所有未安装的依赖项。

【讨论】:

谢谢,这很有用!虽然我认为它仍然遗漏了一些不满意的依赖关系,例如如果 gem A 依赖于 gem B 的 x 版本,但只安装了 gem B 的版本 y,则不会显示 gem A 的依赖关系不满足,因为它只检查 gem B 是否已安装。 如果答案有用,您可以考虑投票。您正在寻找的功能曾经被称为“gem lock”,但lock 命令已被弃用,rubygem 小组推荐使用 Bundler。我的旧版 gems 仍然有 lock 命令,你可以看看你的是否也有。 如果 *** 允许,我会投票赞成 :-( 它需要 15 名声望,考虑到这是我自己的问题,这似乎很荒谬。【参考方案3】:

您是否尝试过运行gem update?这将为您的所有 gem 运行所有依赖项测试。您可以运行它以安装到单独的目录中。

[编辑] 另外,当你运行gem check 时会发生什么? gem dependency 将列出所有 gem 依赖项。我很确定,如果它没有告诉您是否安装了某些东西,您可以将输出通过管道传送到check 之类的命令,以查看是否安装了这些 gem。 [/编辑]

【讨论】:

谢谢,但这也会产生更改 gem 版本的副作用,这可能会破坏我的 Rails 应用程序。我专门在对本地宝石进行了只读检查之后 - 我将更新原始问题以明确这一点。 真的。但是您可以运行它,以便更新不会安装在您的 gem 文件夹中。另外,你可以试试gem outdated gem check 不输出任何东西,但它并没有声称要检查依赖关系。同样,gem outdated 仅报告哪些 gem 有更新的版本可用,再次忽略任何依赖关系。【参考方案4】:

我知道您说过您对有关 Bundler 的答案不感兴趣,但是……

Bundler 将为您处理 gem 依赖项解析,并且与 Rails 2.3 兼容。我已经将 Bundler 与许多 Rails 2 应用程序一起使用,并且没有任何问题。

这里有在 Rails 2.3 上安装 Bundler 的说明:http://gembundler.com/rails23.html

【讨论】:

谢谢 - 很高兴知道。但是假设我安装了 Bundler,我将如何对所有已安装的 gem 执行依赖项检查?我是否必须创建一个包含所有这些的虚拟 Gemfile,然后运行 ​​bundle check 或类似的? 我不建议使用虚拟 Gemfile,而是完全转向 Bundler。这样,您不仅可以解决当前的问题,还可以避免将来发生此类事情。 谢谢 - 我看过 Bundler,我认为你是对的。很遗憾gem 不支持检查损坏的依赖项,但是将我的工作流程更改为 Bundler 意味着我不必再关心损坏的依赖项,因为bundle install 将确保任何重要的损坏的依赖项 在给定项目的上下文中是固定的。

以上是关于如何检查已安装的 Ruby gem 的所有依赖项是不是满足?的主要内容,如果未能解决你的问题,请参考以下文章

移除所有已安装的 Gem 并重新开始

安装 ruby​​ gem nokogiri 时缺少 libxslt

在本地存储和安装ruby gems用于ruby项目

如何安全地更新 Rails 应用程序中的所有 gem

如果彼此依赖,如何要求ruby gem中的文件

gem list和gem查询有什么区别?