管理Rails的gem版本/依赖项

时间:2010-12-07 08:50:48

标签: ruby-on-rails ruby rubygems dependencies bundle

只是一点背景,我来自一个强大的C#/静态类型背景。因此,我倾向于用.dlls来思考。所以,如果我在一个项目中工作,我会参考我需要的dll,那就是那个。

对Ruby和Rails不熟悉我发现我可能做错了什么。例如,我使用本地的宝石在家创建一个Rails应用程序。使用不同的计算机(比如工作计算机)我试图在项目上工作,却发现我使用的是不同版本的宝石。执行捆绑安装后,我又回到了一个工作项目。

我遇到的问题是我的宝石库变得“凌乱”。我最终得到了同一个宝石的几个版本。这是其他人的工作方式吗?当使用gem(来自require)时,它会默认为最新版本吗?我觉得好像我没有正确地管理依赖关系,尽管我已经提到过我是Ruby的新世界。

我是否应该只包含我的依赖项,然后每次有不同/缺少的依赖项时执行bundle安装?如果我想升级到更新版本的gem,会发生什么?是否会更新bundle使用并继续使用它的gemfile?

2 个答案:

答案 0 :(得分:8)

是的,bundler是使用Ruby on Rails处理依赖项的方法。为什么?首先,因为它随附(至少3.0版本)。第二,因为它很简单(与Java不同)。

非详尽的功能列表:

  • 它允许您声明一个或多个gem存储库以从
  • 获取gem
  • 按环境(开发,生产......)对依赖项进行分组
  • 指定您想要的版本

等等。有关详情,请查看此http://gembundler.com/rationale.html

关于您的问题:是的,如果没有指定,bundler将采用最新版本。

另外,我会添加一个不足之处:您无法根据操作系统指定gem版本。例如,nokogiri有一个linux版本和一个win版本。

答案 1 :(得分:0)

在gem中需要模块时的默认行为是假设您需要安装多个gem的最新版本。您可以在specifying which version you想要在特定应用程序中更改此内容,如下所示:

gem "rails", "2.3.8"

在你需要宝石的任何东西之前。这可确保此应用程序将使用指定版本的gem,即使安装了较新版本。

当您不再需要它们时,或者如果您始终如一地使用Bundler,您当然可以清除已安装宝石的过时版本:只需擦除所有内容并再次运行bundler即可安装所需的宝石。

另一个有用的工具是Ruby Version Manager(RVM),除了处理不同版本的ruby之外,它还提供了一个名为gemsets的功能,它允许您将不同的应用程序或环境隔离开来。也就是说,App A可以拥有其所有必需宝石的独立gemset,而App B则拥有另一个仅包含其所需宝石的gemset。这样可以减少依赖关系中的混乱。