代码之家  ›  专栏  ›  技术社区  ›  Pete Hodgson

将gems解包/冻结到非Rails Ruby应用程序中

  •  3
  • Pete Hodgson  · 技术社区  · 17 年前

    我正在编写一个非Rails Ruby应用程序(Gass!)并且希望能够将应用程序需要的所有gem依赖项包含在vendor子目录中。这将类似于 http://gemsonrails.rubyforge.org/ 适用于Rails应用程序。

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

    1 回复  |  直到 16 年前
        1
  •  4
  •   Ryan McGeary    16 年前

    更新(新解决方案):

    试试耶胡达·卡茨的新发型 bundler 宝石。 gem install bundler 然后创建一个 Gemfile 所有的依赖。有关详细信息,请参阅文档。

    旧建议:

    一个简单的方法是手动将宝石解包到 vendor 目录并将解包gems的lib路径添加到$load_路径的前面。

    打开宝石:

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

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

    要将vendor/gems下的所有gems添加到$load_路径,请尝试向应用程序的初始化中添加类似的内容:

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

    更新: 萨拉(在评论中)说服了我,有必要重写gem_路径。有一种方法可以做到:

    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_s Intelligent Packaging)用于管理依赖项。瑞普看起来很可爱,但它还是新的。

    推荐文章