【发布时间】:2009-09-07 11:45:32
【问题描述】:
据我所知,唯一的区别在于“安装”。我还听说插件更难更新。但是我想安装一些插件而不是 gem 吗?
【问题讨论】:
-
请注意,RubyGem 也可以用作插件。
据我所知,唯一的区别在于“安装”。我还听说插件更难更新。但是我想安装一些插件而不是 gem 吗?
【问题讨论】:
宝石:
vendor/gems)插件:
显然,插件的唯一优势是强大的优势,因为插件仍然很常见。我倾向于同意。发布插件 = 创建一个 github 存储库。发布一个 gem 需要你创建一个 gemspec,甚至可能涉及到 Gem Beast (rubyforge),它们都是 PITA。
【讨论】:
gemcutter 现在,这有点简单。
我想说这个问题可能会引起争论,哪个是最好的方法,但我的想法仍然是..
如果给定选项,我会说在插件上使用 gem 的最大胜利是 gem 依赖项。
Rails 插件不处理依赖项,因此如果您安装的插件依赖于其他插件/gems,则额外安装这些插件会带来不便。安装 gem 可以同时引入它运行所需的任何依赖项。以黄瓜宝石为例:
'sudo gem install cucumber' 将安装 cucumber gem,但也会安装其依赖项,例如 webrat gem。
这似乎不是什么大事,但是当您处理多个环境(开发、登台、生产等)时,您更容易遇到依赖问题。
您可能需要插件而不是 gem 的唯一情况是您想要方便地访问插件代码。一种情况可能是插件实际上是 Rails 引擎,您需要快速深入研究代码并查看要覆盖的类/视图。另一种情况可能是,如果您分叉了一个插件,例如 active_merchant,并将其设置为 vendor/plugins 中的 git 子模块。在这种情况下,向上游提交和推送更改往往更方便。
至于更难更新,gems 有 rubygems 来管理它们,这很简单,如果你碰巧使用 git,那么子模块插件更新是轻而易举的:
# 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 或插件不应该影响代码的功能,因为它们只是打包代码的两种不同方式,最终归结为我猜你觉得更方便使用的方式。就我个人而言,我发现 gems 更容易维护,除非我可能会陷入代码中,然后一个子模块插件对我更有利,因为它会显示在我的编辑器的项目树中。
【讨论】:
如果可能,我总是使用 gem,因为我觉得让它们保持更新更容易。
然而,一个主要的烦恼是 gems 不能提供 rake 任务,但插件可以。例如,当您尝试执行 rake paperclip:refresh 却被告知任务不存在时,这通常会导致挫败感。
解决方案是将 gem 的 rake 任务复制到您的应用程序任务目录。
【讨论】: