Ruby Gem和Rails插件有什么区别?

时间:2009-09-07 11:45:32

标签: ruby-on-rails rubygems

据我所知,唯一的区别在于“安装”。我也听说插件在某种程度上更难更新。但是我想安装一些插件而不是gem?

3 个答案:

答案 0 :(得分:4)

宝石:

  • 可以处理依赖项
  • 可在系统范围内安装
  • 也可以出售(vendor/gems
  • 有版本概念,可以轻松指定您想要的版本

插件:

  • 非常容易为作者发布

显然,插件的唯一优势是强大的优势,因为插件仍然很常见。我倾向于同意。发布插件=创建github存储库。发布宝石需要你创建一个gemspec,甚至可能干涉宝石兽(rubyforge),它们都是PITAs。

答案 1 :(得分:3)

我认为这个问题很可能是值得商榷的,这是最好的方法,但我的想法一点也不...

如果给出选项,我会说在使用gem而不是插件时获得的最大胜利是gem依赖。

Rails插件不处理依赖项,因此如果您安装依赖于其他插件/ gem的插件,则会额外安装这些插件带来的不便。安装gem的同时可以引入运行所需的任何依赖项。以黄瓜宝石为例:

'sudo gem install cucumber'将安装黄瓜宝石,但也会安装其依赖项,例如webrat gem。

这可能看起来不是什么大事,但是当您处理多个环境(开发,登台,制作等)时,您更容易遇到依赖性问题。

您可能希望访问插件代码的唯一情况是,您可能需要一个基于gem的插件。一种情况可能是如果插件实际上是Rails引擎,您需要快速浏览代码并查看要覆盖的类/视图。另一种情况可能是你已经分叉了一个插件,比如active_merchant,并将它设置为vendor / plugins中的git子模块。在这种情况下,提交和推动上游变化往往更加方便。

至于一个更难更新的东西,宝石有rubygems来管理它们,这很简单,如果你碰巧使用git那么子模块插件是一个需要更新的doddle:

# installing a plugin as a git submodule
git submodule add git://path_to_plugin_git_repo.git vendor/plugins/plugin_name

# updating said git submodule
cd vendor/plugins/plugin_name
git remote update
git rebase origin/master
cd ../../..
git add .
git commit -m "update plugin_name to latest master."

或SVN外部的等效物

安装某些东西作为gem或插件但不应该影响代码的功能,因为它们只是两种不同的代码打包方式,最后归结为你觉得使用起来更方便的东西。就个人而言,我发现宝石更容易维护,除非我可能会陷入代码,然后一个子模块插件更有利于我,因为它会出现在我的编辑器的项目树中。

答案 2 :(得分:2)

如果可能的话,我总是使用宝石,因为我觉得让它们更新更容易。

然而 ,一个主要的烦恼是宝石无法提供佣金任务,但插件可以。例如,当您尝试执行rake paperclip:refresh仅被告知任务不存在时,这通常会导致沮丧。

解决方案是将gem的rake任务复制到你的apps任务目录。