1

奇妙なことに、ディスクスペースが貴重なmod_railsサーバーがあります。Pythonのzipimportのように、アプリケーションのソースを圧縮する方法はありますか?

これには明らかな欠点があるので、おそらく分解してディスクスペースにニッケルを費やす必要がありますが、試してみる価値があると思いました。

4

2 に答える 2

2

おお、これはすっきり。rubyzipジェムをチェックしてください:

rubyzip には zip/ziprequire.rbモジュール ( source ) も含まれており、これにより ruby​​ は zip アーカイブから ruby​​ モジュールをロードできます。

(更新: ziprequire.rb は ruby​​zip gem に存在しなくなりましたが、ソースリンクには古いコンテンツが含まれているようです。)

そのようです。これは彼らの例からわずかに変更されています:

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

もちろん、zip 形式のライブラリを作成するために ruby​​zip ライブラリを使用する必要はありません。そのために CLI zip を使用できます。

于 2010-01-15T05:44:06.750 に答える
1

requireload他のメソッドと同じです。それらを未定義、再定義、オーバーライド、フック、ラップして、必要なことを行うことができます。実際、RubyGems はまさにそのように機能します。

さて、誰かがすでにあなたのためにこれを実装しているかどうかはわかりませんが、実際にはruby ​​-talk メーリングリストでこれに関する議論がいくつかあったことを覚えています。

ただし、別の場所からライブラリコードをロードする例いくつかあります。これらを参照して、目的に合わせてそれらが行っていることをコピー/適応させることができます。

  • http_requireはその名のとおりのことを行います: requireHTTP URIに
  • Crateは、Ruby アプリケーションを単一のバイナリといくつかの SQLite データベースにパッケージ化する Ruby パッケージ ツールです。requireファイルシステムの代わりに (暗号化された) SQLite データベースからライブラリをロードするように変更します。
  • そしてもちろん、 RubyGemsについてはすでに言及しました
于 2010-01-15T03:21:33.417 に答える