将宝石解压/冻结到非rails ruby应用程序中[英] unpacking/freezing gems into a non-rails ruby app

本文是小编为大家收集整理的关于将宝石解压/冻结到非rails ruby应用程序中的处理方法,想解了将宝石解压/冻结到非rails ruby应用程序中的问题怎么解决?将宝石解压/冻结到非rails ruby应用程序中问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

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

推荐答案

更新(新解决方案):

试试 Yehuda Katz 的新 bundler 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 及其依赖项(使用正确的版本).

要将 vendor/gems 下的所有 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 看起来很可爱,但它还是新的.

本文地址:https://www.itbaoku.cn/post/786467.html