2010-01-15 3 views
1

나는 디스크 공간이 충분하지 않은 mod_rails 서버를 가지고있다. Python's zipimport처럼 내 응용 프로그램 소스를 압축 할 수있는 방법이 있습니까?Zip 아카이브에서 루비 소스를로드 중입니까?

명백한 단점이 있기 때문에 디스크 공간에 니켈을 분해하여 사용하는 것이 좋지만 한 번 사용해 볼 가치가 있다고 생각했습니다.

답변

2

RubyGems 아,이 깔끔 언급했다. rubyzip 보석을 체크 아웃 :

rubyzip 또한 우편 아카이브에서 루비 모듈을로드 루비를 허용하는 zip/ziprequire.rb 모듈 (source)를 제공합니다.

(업데이트 다음 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

실제로 흥미 롭습니다. ziprequire.rb는 더 이상 존재하지 않습니다. 분명히 [문제가 있습니다] (https://github.com/rubyzip/rubyzip/issues/51). [Here] (https://github.com/rubyzip/rubyzip/commit/794c9463fcb2f5a0bd41f4645978e691c66b0ea6)는 "공식적인"RubyZip 저장소에서 제거 된 실제 커밋입니다. 물론, 필요에 따라 자신의 프로젝트에 추가 될 수 있습니다 ... –

+0

이 게시물 avail에 편집 됨. –

1

requireload은 다른 방법과 동일합니다. 정의를 해제하고, 재정의하고, 재정의하고, 연결하고, 원하는 모든 것을 수행하도록 래핑 할 수 있습니다. 실제로 RubyGems가 작동하는 방식입니다.

누군가가 이미 을 구현했는지 여부는 모르겠지만 실제로는 ruby-talk 메일 링리스트에서 이에 대한 토론을 기억하고 있습니다.

그러나, 당신이 볼 수있는 다른 위치에서로드 라이브러리 코드의 몇 가지 예들이있다, 어쩌면 복사/ 당신의 목적을 위해 무엇을하고 있는지에 적응 : 거의

  • http_require가하는 무엇이 들리겠습니까? : require an HTTP URI
  • 는 Ruby 애플리케이션을 단일 바이너리와 몇 개의 SQLite 데이터베이스로 패키징하는 루비 패키징 도구입니다. 그것은 require가 파일 시스템
  • 대신 (암호화) SQLite 데이터베이스에서 라이브러리를로드하기 위해 수정하고 물론 나는 이미