Ruby: создание сжатого архива Tar

Как лучше всего создать сжатый tar-архив с помощью Ruby?

У меня есть приложение Rails, которому необходимо создать сжатый архив в ответ на действия пользователя. В идеале можно было бы записывать непосредственно в сжатый файл без необходимости предварительного создания промежуточных временных файлов. Библиотека Ruby Zlib поддерживает прямой gzip. сжатие. Как я могу совместить это с выводом tar?

По-видимому, было предложено несколько квазирешений, и большая часть информации кажется устаревшей.

Например, самый популярный результат поиска Google по запросу «ruby tar» дает эту ветку, которая была начата в 2007 году и, по-видимому, безрезультатно.

Еще одним высокопоставленным результатом поиска является описание рубина смола. Он датируется 2002 годом, и анонс не совсем внушает доверия.

Я также видел различные отчеты об использовании unix tar и тому подобного.

Итак, я знаю, что есть много способов сделать это, но я действительно ищу рекомендацию самого надежного и удобного от того, кто пробовал несколько альтернатив.

Есть идеи?


person Rich Apodaca    schedule 11.07.2009    source источник
comment
Это очень похоже на мой вопрос: stackoverflow.com/questions/7856491/ruby-streaming-tar-gz Кто-нибудь нашел ответ?   -  person Tony R    schedule 22.10.2011
comment
Я все еще играю с этим, но это выглядело как хорошая идея. Ruby Archive::Tar< /а>   -  person FilBot3    schedule 05.06.2014
comment
Попал сюда с первой страницы поиска create a gzipped tar. Пожалуйста, рассмотрите обобщающий вопрос для использования не-Ruby.   -  person Josh Habdas    schedule 06.09.2018


Ответы (3)


Если вы работаете под Unix, вы можете записать файлы на диск, а затем запустить системный вызов для их tar/gzip.

`tar -czf #{file_name}.tar.gz #{file_name}`
person Scott    schedule 11.07.2009
comment
Мне нравится - очень легко. Несмотря на то, что он не проверяет, установлен ли tar в вашей системе, это разумное предположение, если у них есть ruby ​​:) Не забывайте обратные кавычки ` вокруг него. ТАК не позволил бы мне добавить пробелы впереди, чтобы они были видны. - person Matt Connolly; 21.06.2011

Этот проект Ruby Minitar был обновлен в 2009 году и, похоже, решит вашу проблему.

person Sam Saffron    schedule 11.07.2009
comment
Minitar, похоже, не позволяет записывать tar из потока, только из файлов. Однако он может выводить в поток. - person Tony R; 22.10.2011

В следующем примере показано, как объединить класс GzipWriter из Ruby Zlib и класс TarWriter из RubyGems для создания сжатого tar-архива:

require 'rubygems/package'

filenames_and_contents = {
  "filename" => "content",
}

File.open("archive.tar.gz", "wb") do |file|
  Zlib::GzipWriter.wrap(file) do |gzip|
    Gem::Package::TarWriter.new(gzip) do |tar|
      filenames_and_contents.each_pair do |filename, content|
        tar.add_file_simple(filename, 0644, content.length) do |io|
          io.write(content)
        end
      end
    end
  end
end
person bacongravy    schedule 16.03.2018