我正在编写一个非Rails ruby应用程序(喘气!),并希望能够在vendor子目录中包含应用程序所需的所有gem依赖项。这与http://gemsonrails.rubyforge.org/对Rails应用程序的工作方式类似。
这里的目标是避免我的团队在添加新依赖项时目前遇到的情况。我团队中的每个开发人员都必须手动安装gem,然后有人必须手动更新每个测试和登台和生产机器。如果我们可以将依赖关系冻结到分布式应用程序本身,那么只需要一个简单的svn更新(或人群中那些赶时髦的人的git pull)。
答案 0 :(得分:4)
更新(新解决方案):
尝试Yehuda Katz的新bundler宝石。 gem install bundler
然后创建一个包含所有依赖项的Gemfile
。有关详细信息,请参阅文档。
旧建议:
一种简单的方法是手动将gems解压缩到vendor
目录中,并将解压缩的gems的lib路径添加到$ LOAD_PATH的前面。
解压宝石:
$ cd vendor/gems
$ gem unpack active_support
Unpacked gem: '/path/to/myproject/vendor/gems/activesupport-2.3.2'
请确保解压缩所有必需的gem及其依赖项(使用正确的版本)。
要将所有gem / gem下的宝石添加到$ LOAD_PATH,请尝试在应用程序的初始化中添加类似这样的内容:
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看起来真的很甜,但它还是新的。