将gem拆开/冻结成非铁轨ruby应用程序

我正在编写一个非Rails ruby​​应用程序(喘气!),并希望能够在vendor子目录中包含应用程序所需的所有gem依赖项。 这类似于http://gemsonrails.rubyforge.org/如何为Rails应用程序工作。

这里的目标是避免在添加新依赖项时我的团队目前遇到的情况。 我的团队中的每个开发人员都必须手动安装gem,然后有人必须手动更新每个测试和登台和生产计算机。 如果我们可以将依赖关系冻结到分布式应用程序本身,那么只需要一个简单的svn更新(或人群中那些嬉皮士的git pull)。

更新(新解决方案):

尝试Yehuda Katz的新捆绑gem。 然后, gem install bundler创建一个包含所有依赖项的Gemfile 。 有关详细信息,请参阅文档。

旧建议:

一种简单的方法是手动将gem解压缩到vendor目录中,并将解压缩的gem的lib路径添加到$ LOAD_PATH的前面。

解压gem:

 $ cd vendor/gems $ gem unpack active_support Unpacked gem: '/path/to/myproject/vendor/gems/activesupport-2.3.2' 

只需确保解压缩所有必需的gem及其依赖项(使用正确的版本)。

要将所有gem添加到$ LOAD_PATH的供应商/gem下,请尝试在应用程序的初始化中添加这样的内容:

 Dir.glob(File.join("vendor", "gems", "*", "lib")).each do |lib| $LOAD_PATH.unshift(File.expand_path(lib)) end 

更新: Sarah(在评论中)说服我可能还需要覆盖GEM_PATH。 这是一种方法:

 require 'rubygems' gem_paths = [File.expand_path(File.join("vendor", "gems")), Gem.default_dir] Gem.clear_paths Gem.send :set_paths, gem_paths.join(":") 

另一个选择是研究Rip (Ruby的智能包装)来管理您的依赖项。 Rip看起来很甜美,但它仍然是新的。