40

如何在我的 Gemfile 中找到未使用的 gem,以便我可以清理不再使用的引用。

4

6 回答 6

47

使用 linux 的文件访问时间来查看实际使用的内容。

这需要:

  1. 在 rvm gemset 中隔离的项目 gem
  2. 安装在使用 atime(ubuntu 12.04 上的 strictatime)选项安装的分区上的 gem:

    sudo mount -o remount,strictatime /

  3. 完整的测试覆盖(即我们将依靠测试运行来更新文件访问时间)

记下时间并运行测试。然后从您的 gemdir 执行:

ls --time-style long-iso -ltud1 $PWD/*/lib/** | grep "21:44" | sed s/.*gems.// | sed s/.lib.*// | sort -u

将 21:44 更改为您运行测试的任何时间。

于 2015-02-20T12:26:27.980 回答
16

运行您的测试,然后:

gem stale

执行以下操作:

stale 命令列出了已安装 gem 中所有文件的最新访问时间。

您可以使用此命令来发现您不再使用的 gem 和 gem 版本。

于 2018-12-04T12:23:29.880 回答
14

如果所有测试在没有宝石的情况下通过,则应考虑移除任何宝石。

假设您有良好的测试覆盖率 - 特别是高级功能测试 - 您可以编写一个脚本来一次选择性地删除一个 gem。即运行所有测试 N 次,其中 N 是 Gemfile 中的宝石数量,每个测试都有一个缺失的宝石。这将有助于剔除宝石而不影响它们的重量。

于 2014-04-06T16:20:37.287 回答
11

您可以使用gem_bench gem 来分析您的 Gemfile 并确定在启动时不需要哪些 gem。从那里只需要进行一些分析即可确定可以完全移除哪些宝石。

要生成可以从引导时删除的 gem 列表:

  1. 添加gem 'gem_bench', :group => :console到您的 Gemfile。
  2. bundle install
  3. bundle exec rails console使用以下命令运行:
  4. a = GemBench.check({verbose: true})
于 2014-09-16T22:57:00.617 回答
8

我怀疑是否有一种自动方法可以在 Gemfile 中找到未使用的 gem。

对于随着时间的推移构建应用程序的人来说,手动识别由于某种原因而被丢弃的宝石应该很容易。

对于从其他人继承的遗留应用程序,手动识别未使用的 gem 是一项非常困难的任务。如果系统有全面的测试覆盖率,它将有助于通过反复试验删除未使用的 gem,同时确保测试在 Gemfile 中的每次更改时通过。

于 2013-01-15T09:04:29.007 回答
5

bundle clean --force删除定义之外的 gem 的命令Gemfile.lock

请参阅捆绑清洁

于 2013-03-15T22:06:15.963 回答