私はGrit(Ruby gem)を使用してgitリポジトリをロードし、特定のコミットをフォルダに抽出してから、それを「実行」しています。Grit は、「tar アーカイブを含む文字列」を返すarchive_tarで git アーカイブをサポートします。可能であればRuby libs / gemsを使用して(直接システムコールではなく)これをファイルシステムに抽出し、最初にデータをアーカイブに保存してから抽出するなどのことを避けたいと思います(ここで効率的なワンライナーを本当に探しています)。
質問する
1640 次
1 に答える
2
'tarアーカイブを含む文字列'が同等であるという仮定の下で
File.open("Downloads.tar", "rb") {|a| a.read }
fileutils、stringio、およびminitargemを使用してこれを実現できます。まず、minitarをインストールする必要があります。これは次のように簡単です。
gem install minitar
minitarは、ストリームを使用するための通常の解凍をサポートしていないため、独自の基本的な解凍方法を作成します。
require 'archive/tar/minitar'
require 'stringio'
require 'fileutils'
def unpack_tar(directory, string)
FileUtils.mkdir_p(directory) if !File.exist?(directory)
stringio = StringIO.new(string)
input = Archive::Tar::Minitar::Input.new(stringio)
input.each {|entry|
input.extract_entry(directory, entry)
}
end
unpack_tar("./test", File.open("Downloads.tar", "rb") {|a| a.read })
もちろん、File.open部分全体をGritgemのarchive_tar
機能に置き換えます。これはすべて、もちろん最初の仮定を前提としていますが、この方法はarchive_tar
実際に返されるものに合わせて簡単に適合させることができると確信しています。
于 2012-10-22T02:38:05.430 に答える