如何检查已安装的 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 的所有依赖项是不是满足?的主要内容,如果未能解决你的问题,请参考以下文章