将宝石拆开/冻结成非铁轨红宝石应用程序

时间:2009-07-10 16:20:17

标签: ruby rubygems

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

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

1 个答案:

答案 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看起来真的很甜,但它还是新的。