ruby - 删除所有已安装的 Gem,特定版本除外

标签 ruby rubygems

我的任务是编写一个自动清理脚本,用于删除我们构建系统上未使用的 RubyGems 版本。该系统不使用 Bundler,所以我们所做的是手动跟踪我们的构建系统的哪些部分使用了特定 gem 的哪些版本。系统的不同部分可以使用同一 gem 的不同版本。

这让我们对自动清理感到困惑。我们有一个我们需要保留的版本列表,但我们想摆脱该 Gem 的所有其他未使用版本。我看过 RubyForge docs ,而且似乎没有一种简单的方法可以实现这一目标。

是否有合理的方法来删除除某些指定版本之外的所有版本的 gem?

最佳答案

实际上是 8 行有效代码 :)(不包括收集输入)

# output of `gem list` command
all_gems = <<-GEMS
rvm-capistrano (1.2.7, 1.2.6)
sinatra (1.4.2, 1.3.5, 1.3.3)
tilt (1.4.1, 1.3.7, 1.3.6, 1.3.5, 1.3.3)
GEMS

we_need_these = {
  'sinatra' => '1.4.2',
  'tilt' => '1.4.1'
}

all_gems.split("\n").each do |line|
  versions = line.gsub(/[\(\),]/, '').split(' ')
  gem_name = versions.shift

  versions.each do |v|
    unless we_need_these[gem_name] == v
      # `puts` is used for demonstration purposes. 
      # you'll want to use backticks or `system` method or similar
      puts "gem uninstall #{gem_name} -v #{v}"
    end
  end
end
# >> gem uninstall rvm-capistrano -v 1.2.7
# >> gem uninstall rvm-capistrano -v 1.2.6
# >> gem uninstall sinatra -v 1.3.5
# >> gem uninstall sinatra -v 1.3.3
# >> gem uninstall tilt -v 1.3.7
# >> gem uninstall tilt -v 1.3.6
# >> gem uninstall tilt -v 1.3.5
# >> gem uninstall tilt -v 1.3.3

关于ruby - 删除所有已安装的 Gem,特定版本除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16739538/

相关文章:

ruby - 为什么 bundler 使用多个 gem 位置?

ruby - gem 血统一人两 parent

ruby - $ GEM_HOME和$ GEM_PATH在旅客中设置错误

没有 `each` 的 ruby 哈希迭代

ruby - 使用 Puppet list 自动创建 Nagios 主机组

ruby-on-rails - 如何使用 postgresql 验证 Rails 中的重叠时间

ruby - 如何在 ubuntu 18.04 上安装 vagrant 2.2.0?

ruby-on-rails - 指纹不能为空/内容 公钥无效

ruby-on-rails - 在 rspec 和 devise 中测试重定向

ruby-on-rails - 第三方集成代码放置的 Ruby on Rails 最佳实践