如何组织Rails App和多个引擎的开发

时间:2012-12-04 22:00:28

标签: ruby-on-rails-3 git bundler rails-engines

实际上很难制定问题,所以我只是解释一下情况。

我正在开发一个由多个子应用程序组成的应用程序。主应用程序只提供导航栏和一些基本功能,如用户配置和权限,而子应用程序提供实际功能。

现在这是一个Rails 2应用程序,子应用程序嵌入到框架中,它的设计并不是很好,而且设置起来相当复杂。 幸运的是,我们现在有了Engines,这将是这个应用程序的更好的解决方案。

到目前为止,所有内容都存在于subversion中并且可以立即更新,共享代码使用外部。在我们进行重组和重构时,我们想转向git。 过去几天我一直在搜索关于bundler,git子模块和git子树的网页,但我还没有找到一个很好的描述如何正确地管理一个包含多个Engines / Gems的大型项目,当你开发所有这些项目时同时。

特别是我希望能够:

  • 使用Bundler来管理依赖关系
  • 不要将我们自己的Gems和Engines安装到全局gem路径中,而是相对于主应用程序,作为git存储库
  • 将我们自己的Gems和Engines设置为git存储库(可能使用Bundler的本地路径覆盖)
  • 一种简单的方法来获取所有依赖项(捆绑安装),它会提取我们自己的Gems和Engines的最新版本,如果那是不可能的,那么git的一个命令可以拉动所有自己的Gems和Engines(也许是一个rake任务?)
  • 让新开发人员可以轻松快速地设置整个开发环境(git克隆应用程序,捆绑安装依赖项,包括所有自己的Gems和引擎,本地)
  • 轻松部署Capistrano

我已经考虑过:

  • 将所有内容整合到一个存储库中,似乎为我打败了单独的Gems / Engines的目的,我认为它不允许我们通过Bundler管理我们的引擎上的主应用程序的依赖关系
  • 使用子模块,我读了太多关于它为什么不好的帖子,而且我们的开发人员数量只是时间问题,直到有人提交一个子模块指针指向只存在于他的本地存储库中的提交
  • git subtree实用程序,对我来说似乎相当复杂

您是否有类似的设置,如何管理它以尽可能简单地进行更新和提交更改?您在哪里放置应用程序所依赖的Engine / Gem代码?

TL; DR 如何管理由多个引擎和宝石组成的大型铁路项目?

2 个答案:

答案 0 :(得分:4)

我们公司有类似(但可能不那么复杂)的案例。我们做什么(就像现在一样),这对你也有用:

将您的Rails应用程序放在自己的git存储库中。每个宝石都有自己的存储库(虽然可以这样做,“一个gem =一个git存储库”将使你的生活更轻松。)

然后在你的Rails应用程序Gemfile中,你有几个选项

  • 默认应该是将每个gem引用到它的git存储库(以便bundle从那里加载它们)
  • 在本地处理某些gem和Rails应用程序时,可以通过在本地覆盖路径来更改Gemfile以使用本地路径(http://gembundler.com/v1.2/gemfile.html)或更好(请参阅:http://gembundler.com/v1.2/git.html)。请注意,这两个选项是不同的:第一个使用路径,第二个使用本地git存储库(因此第一个,而不是第二个)可以看到新的未提交的更改。

为了轻松更新所有宝石,我会创建一个小的.sh脚本(只是为了启动各种克隆或更新操作,以及捆绑安装,以便一切都干净),并使用主应用程序提交。我还会在团队中找到一个“标准文件夹组织”(即每个人都使用他们选择的基本文件夹,在Rails应用程序和每个gem的文件夹下),以使程序更容易。

我希望这可以帮助或获得你的想法(你的问题非常复杂和多方面,所以我不能100%确定这是你正在寻找的)。

答案 1 :(得分:1)

如何管理您的Gem依赖项?
Bundler通过Gemfile。

如何管理您的引擎?
Bundler通过Gemfile。
将您的引擎构建为Gems并在Gemfile中提供它们的git repo位置。如果您需要示例,请查看如何在Gemfile中包含https://github.com/radar/forem gem。

另外,这帮助我学习了Rails Engines,http://edgeguides.rubyonrails.org/engines.html

你是来自Java Land吗?
Rails确实有学习曲线,但不像Java山崖那样下降。