除特定版本外,删除所有已安装的Gems

时间:2013-05-24 16:23:05

标签: ruby rubygems gem

我的任务是编写一个自动清理脚本,在Build系统上删除未使用的RubyGems版本。系统不使用Bundler,所以我们所做的就是手动跟踪Build系统的哪些部分使用哪些版本的某些gem。系统的不同部分可以使用同一个宝石的不同版本。

这使我们陷入了自动清理的困境。我们有一个我们需要保留的版本列表,但我们想要摆脱该Gem的所有其他未使用版本。我看过RubyForge docs,看起来并不是一个简单的方法来实现它。

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

1 个答案:

答案 0 :(得分:4)

实际上是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