我的任务是编写一个自动清理脚本,以删除我们构建系统上未使用的 RubyGems 版本。该系统不使用 Bundler,因此我们所做的是手动跟踪构建系统的哪些部分使用某些 gem 的哪些版本。系统的不同部分可以使用同一个 gem 的不同版本。
这让我们在自动清理方面陷入困境。我们有一个需要保留的版本列表,但我们希望删除该 Gem 的所有其他未使用版本。我查看了RubyForge 文档,看起来没有一种简单的方法可以实现这一点。
是否有合理的方法来删除除某些指定版本之外的所有版本的 gem?
我的任务是编写一个自动清理脚本,以删除我们构建系统上未使用的 RubyGems 版本。该系统不使用 Bundler,因此我们所做的是手动跟踪构建系统的哪些部分使用某些 gem 的哪些版本。系统的不同部分可以使用同一个 gem 的不同版本。
这让我们在自动清理方面陷入困境。我们有一个需要保留的版本列表,但我们希望删除该 Gem 的所有其他未使用版本。我查看了RubyForge 文档,看起来没有一种简单的方法可以实现这一点。
是否有合理的方法来删除除某些指定版本之外的所有版本的 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