Загрузка исходного кода ruby ​​из zip-архива? - PullRequest
1 голос
/ 15 января 2010

У меня есть сервер mod_rails, где дисковое пространство, как ни странно, стоит дорого. Есть ли способ сжать исходный код моего приложения, например zipimport Python ?

У этого есть очевидные недостатки, поэтому я, вероятно, должен просто сломаться и потратить никель на место на диске, но я решил, что это будет стоить выстрел.

Ответы [ 2 ]

2 голосов
/ 15 января 2010

О, это аккуратно. Проверьте rubyzip драгоценный камень:

rubyzip также имеет zip / ziprequire.rb модуль ( источник ), который позволяет ruby для загрузки модулей ruby ​​из zip архивы.

( Обновление : ziprequire.rb больше не присутствует в геме rubyzip, но, тем не менее, ссылка source содержит старое содержимое.)

Вот так. Это только немного изменено по сравнению с их примером:

require 'rubygems'
require 'zip/zipfilesystem'
require 'zip/ziprequire'

Zip::ZipFile.open("/tmp/mylib.zip", true) do |zip|
  zip.file.open('mylib/somefile.rb', 'w') do |file|
    file.puts "def foo"
    file.puts "  puts 'foo was here'"
    file.puts "end"
  end
end

$:.unshift '/tmp/mylib.zip'
require 'mylib/somefile'

foo    # => foo was here

Конечно, вам не нужно использовать библиотеку rubyzip для создания архива. Вы можете использовать CLI zip для этого.

1 голос
/ 15 января 2010

require и load просто методы, как и любой другой. Вы можете отменить их, переопределить их, переопределить их, зацепить их, обернуть их, чтобы сделать все, что вы хотите. На самом деле, именно так работает RubyGems.

Теперь я не знаю, реализовал ли кто-то это для вас , но я действительно помню некоторые обсуждения этого в списке рассылки ruby-talk .

Однако, есть некоторые примеры загрузки библиотечного кода из альтернативных мест, которые вы можете посмотреть, и, возможно, скопировать / адаптировать то, что они делают для вашей цели:

  • http_require делает в значительной степени то, на что это похоже: он позволяет вам require HTTP URI
  • Crate - это инструмент упаковки Ruby, который упаковывает приложение Ruby в один двоичный файл и пару баз данных SQLite; он изменяет require для загрузки библиотек из (зашифрованной) базы данных SQLite вместо файловой системы
  • и, конечно, я уже упоминал RubyGems
...