1

我有一个 mod_rails 服务器,奇怪的是,它的磁盘空间非常宝贵。有没有办法让我压缩我的应用程序的源代码,比如Python 的 zipimport

这样做有明显的缺点,所以我可能应该崩溃并在磁盘空间上花费一分钱,但我认为值得一试。

4

2 回答 2

2

哦,这很整洁。查看ruby​​zip gem:

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

当然,您不必使用 ruby​​zip 库来创建压缩库。您可以为此使用 CLI zip。

于 2010-01-15T05:44:06.750 回答
1

requireload其他方法一样。你可以取消定义它们,重新定义它们,覆盖它们,挂钩它们,包装它们来做任何你想做的事情。事实上,这正是 RubyGems 的工作方式。

现在,我不知道是否有人已经为你实现了这个,但我实际上记得在ruby ​​-talk 邮件列表上对此进行了一些讨论。

但是,有一些从其他位置加载库代码的示例,您可以查看这些示例,并且可能会复制/调整它们为您的目的所做的事情:

  • http_require和它听起来的差不多:它允许你访问require一个 HTTP URI
  • Crate是一个 Ruby 打包工具,它将一个 Ruby 应用程序打包成一个二进制文件和几个 SQLite 数据库;它修改require为从(加密的)SQLite 数据库而不是文件系统中加载库
  • 当然我已经提到了RubyGems
于 2010-01-15T03:21:33.417 回答