【问题标题】:How do you manage multiple Rails applications and services that share code and configuration?您如何管理共享代码和配置的多个 Rails 应用程序和服务?
【发布时间】:2025-02-22 23:25:01
【问题描述】:

我有四个 Rails 应用程序(未来还会有更多)。他们分享:

  • 样式表
  • javascripts
  • 第三方宝石
  • 一些相同的 ActiveRecord 模型
  • 我们自己的 ruby​​ 库
  • 配置/环境变量

我还有一堆rabbitmq服务可以和上面的Rails应用交互。

我正试图弄清楚如何对所有这些东西进行合理的版本控制。现在,我将所有东西都放在一个巨大的 git 存储库中,结构如下:

/站点/rails1 /站点/rails2 /站点/rails3 /服务/服务1 /服务/服务2 /服务/服务2 /lib/our_code /lib/common_js /lib/common_css /config/common_configuration_files

这是一种明智的做法吗?

如果我要将所有内容分解到他们自己的 git 项目中,那么每次更新共享的 gem/library/css 文件(使用 gems/bundler 或其他)时单独更新每个项目似乎会很糟糕。

将所有东西都放在一个项目中的不幸之处在于,我不能(轻松地)将一个应用程序或服务放在 Heroku 上。

这里可以 git subtree 合并帮助吗?也许每个站点/服务都是它自己的分支?

【问题讨论】:

    标签: ruby-on-rails ruby configuration service


    【解决方案1】:

    每个项目一个 repo。共享的东西可以放在自己的仓库中。假设文件结构不变,您可以使用软文件链接来包含这些目录。 Git 将尊重这些软文件链接并将它们签入,但不会在项目的 repo 中包含引用的目录。

    拥有一个大型 repo 会使您的 repos 日志难以跟踪,因为您将拥有与项目的语义划分无关的分支(即进入 Rails 应用程序)。当然,如果您想了解特定文件或目录发生了什么,所有信息都那里,但您的一般git log --name-status 将包含所有项目的信息,这少于可取且难以过滤掉(无需在 git 之上创建临时系统)。

    【讨论】:

    • 我不能指望一个恒定的文件结构。开发人员在自己的机器上进行开发。我部署到不同的文件结构。 CI 机器运行在不同的东西上(使用 Jenkins)。 Heroku 使用他们自己的。由于所有这些差异,我认为我不能将符号链接签入 git。
    • 另外,一个大项目如何让合并变得不可能?
    • @Joe Van Dyk,它没有......我将编辑答案的那部分。
    • 如果符号链接对您不起作用,那可能是被忽略文件的一部分(单个机器/服务器配置)。一台新机器确实需要设置,但是你可以做你想做的事情。
    • 多个项目做分支会不会很痛苦?假设我需要分支出两个服务,一个共享库和一个 Rails 站点。每当我想在分支之间切换时,我都需要在四个不同的项目中切换分支。我们还使用 Github 进行拉取请求。在这种情况下,如果另一个开发人员希望我将某些东西合并到“主”分支中,他需要提交 4 个拉取请求——(如果我不使用 Github,我仍然需要进行 4 次合并) .
    最近更新 更多