【问题标题】:Loading ruby source from a zip archive?从 zip 存档加载 ruby​​ 源?
【发布时间】:2011-01-05 08:38:00
【问题描述】:

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

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

【问题讨论】:

    标签: ruby archive require compression


    【解决方案1】:

    哦,这很整洁。查看rubyzip gem:

    rubyzip 还具有 zip/ziprequire.rb 模块 (source) 允许 ruby 从 zip 加载 ruby​​ 模块 档案。

    更新:ziprequire.rb 不再存在于rubyzip gem 中,但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
    

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

    【讨论】:

    • 确实很有趣。它看起来(快速浏览) ziprequire.rb 不再存在。显然,there is an issue 关于它。 Here 是从“官方”RubyZip 存储库中删除的实际提交。当然,仍然可以根据需要添加到自己的项目中……
    • 已编辑帖子对此有用。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      相关资源
      最近更新 更多