【问题标题】:Version control a content management system?版本控制内容管理系统?
【发布时间】:2011-02-07 09:19:55
【问题描述】:

我在我们编写的 CMS 应用程序中有以下目录结构:

/application
/modules
   /cms
      /filemanager
      /block
      /pages
      /sitemap
   /youtube
   /rss
/skin
   /backend
      /default
         /css
         /js
         /images
   /frontend
     /default
         /css
         /js
         /images

应用程序包含特定于当前 CMS 实现的代码,即此特定 cms 的代码。 模块包含我们跨项目共享的可重用代码部分,例如与 youtube 或 rss 提要一起使用的库。我们将这些作为 git 子模块包含在内,以便我们可以在任何网站中更新模块并将更改推送回所有其他项目。它使得对我们的代码应用更改并分发它变得非常容易。我们想把 CMS 变成一个模块,这样我们就能得到同样的好处——我们可以在源代码控制下运行整个项目,然后根据需要通过 git-submodule 更新 cms。然而,我们遇到了一个问题: cms 需要 javascript/images/css 才能正常工作。

我们考虑过的事情:

  • 我们可以创建 2 个子模块,一个用于 cms-skin,一个用于 cms,但这意味着您不能“git pull”一个版本,而不知道哪些版本的皮肤适用于哪些版本的 cms。即版本 1.2.2 CMS 可能与 1.0.3 CMS-Skin 有问题

  • 我们可以将皮肤添加到 cms 模块,但这有以下问题:

    1. 皮肤应该在文档根目录上可用,模块代码不应该,如果是,它应该可以通过 .htaccess 保护
    2. 用 php 代码捆绑资产似乎没有任何意义
    3. 我们可以在 /skin/backend/ 之间创建一个符号链接以转到 /modules/cms/skin,但这会导致任何安全问题吗?我们是否需要符号链接之类的东西才能使应用程序正常工作?
    4. 我们可以为 git 或 shell 脚本创建一个钩子,在更新发生时将文件从模块/cms/skin 复制到皮肤/后端,但这意味着我们无法在项目中编辑 CMS 核心文件然后推送它们返回

这通常如何在大型 cms 中完成?如何在版本控制下获取 cms 的源代码,为客户端处理应用程序,然后将源代码更新为版本并由供应商提供? Magento 或 Drupal 等应用程序是如何做到这一点的?

【问题讨论】:

    标签: php git version-control content-management-system


    【解决方案1】:

    我不熟悉 CMS 项目,但您可以:

    • 创建 2 个子模块,一个用于 cms-skin,一个用于 cms
    • 使用 cms-skin 作为 cms 中的嵌套子模块

    cms 将是 cms-skin 的“主要项目”,这意味着每次提交 cms 时,您将首先提交 cms-skin,并且“cms commit”将开始使用 cms-skin 的确切 SHA1 引用在提交时。

    这样你就可以只拉取 cms,它会提供你需要的确切版本的 cms-skin。

    有关更多信息,请参阅此 SO answer,了解子模块的真实性质。

    【讨论】:

    • 当然 - 我知道 git repos 通过它们的 sha-hash 跟踪子模块的当前状态,问题是尽管将 cms-skin 放在 cms 中会导致许多其他问题,我对此进行了解释以上
    • @Mike:是的,但我没有完全了解限制是什么。想法是 a/ 在 cms 内的适当位置插入皮肤,b/ 插入一个皮肤版本(即特殊分支),其内容经过重组以符合其新位置(即在 cms 内)
    • "皮肤应该在文档根目录中可用,模块代码不应该,如果是,它可能应该通过 .htaccess 保护"