我在我们编写的 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 模块,但这有以下问题:
- 皮肤应该在文档根目录下可用,模块代码不应该可用,如果是的话,它可能应该通过 .htaccess 进行保护
- 用 php 代码捆绑 Assets 似乎没有任何意义
- 我们可以在/skin/backend/之间创建一个指向/modules/cms/skin 的符号链接(symbolic link),但这会导致任何安全问题吗?我们是否需要类似符号链接(symbolic link)的东西才能使应用程序正常工作?
- 我们可以为 git 创建一个钩子(Hook)或一个 shell 脚本,在发生更新时将文件从 modules/cms/skin 复制到 skin/backend,但这意味着我们失去了在项目中编辑 CMS 核心文件然后推送它们的能力返回
这在大规模 cms 中通常是如何完成的?如何在版本控制下获取 cms 的源代码,处理客户端的应用程序,然后将源代码更新为发布并由供应商提供? Magento 或 Drupal 等应用程序如何做到这一点?
最佳答案
我不熟悉 CMS 项目,但是你可以:
- 创建 2 个子模块,一个用于 cms-skin,一个用于 cms
- 将 cms-skin 用作 cms 中的嵌套子模块
cms 将是 cms-skin 的“主要项目”,这意味着每次提交 cms 时,您都会首先提交 cms-skin,并且“cms 提交”将启动所用 cms-skin 的确切 SHA1 引用在提交时。
这样你就可以只 pull cms,它会带来你需要的 cms-skin 的确切版本。
有关更多信息,请参阅此 SO answer 关于子模块的真正本质。
关于php - 版本控制内容管理系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2628625/