如何将自定义PHP框架转为Git子模块适配多项目并保留根作用域
方案解答
方案选型判定
你的需求场景下submodule是最优适配方案。相比subtree,submodule天然支持框架代码独立迭代、多项目同步拉取更新,且允许你在子项目内直接修改框架代码并推送回上游仓库,完全匹配你提到的「在具体Web项目开发过程中迭代框架功能,其余关联项目可直接拉取更新」的诉求。
核心问题解决步骤
你不需要修改原有框架的代码逻辑,通过软链接或工作目录切换的方式,就能在把框架作为submodule存放在子目录的前提下,保留原有根作用域和路由规则:
1. 先独立框架为单独Git仓库
把所有框架核心文件(含.htaccess、web.php、框架专属目录等)整理为独立的Git仓库,保持原有框架的文件结构不变即可。
2. 在Web项目中接入submodule并兼容原有逻辑
首先在Web项目根目录执行命令添加submodule,指定存放子目录为framework(可自定义名称):git submodule add <你的框架Git仓库地址> framework
之后二选一兼容原有逻辑即可:
方案1:软链接映射(零代码修改,兼容性最高)
直接在Web项目根目录创建软链接,把submodule内的入口文件映射到根目录,完全保留原有请求路径和作用域:- Linux/macOS 执行命令:
ln -s framework/.htaccess .htaccess ln -s framework/web.php web.php - Windows 管理员权限下执行CMD命令:
mklink .htaccess framework\.htaccess mklink web.php framework\web.php
Git会自动保留软链接记录,跨设备同步不会失效。
- Linux/macOS 执行命令:
方案2:重写规则+工作目录切换(无软链接依赖)
如果服务器不允许创建软链接,可手动配置重写规则,同时调整框架入口的工作目录:- 在Web项目根目录新建.htaccess,内容如下:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ framework/web.php?$1 [L] - 在
framework/web.php顶部加一行代码,把PHP工作目录切回Web项目根目录,原有相对路径引入逻辑完全不用修改:chdir(dirname(__DIR__));
- 在Web项目根目录新建.htaccess,内容如下:
3. 后续使用流程
- 在Web项目内修改框架功能时,直接进入
framework目录执行git commit、git push即可把改动同步到框架上游仓库 - 其余项目要更新框架,仅需在项目根目录执行:
git submodule update --remote --merge - 新克隆Web项目时添加
--recursive参数即可自动拉取submodule内容:git clone <Web项目仓库地址> --recursive
内容的提问来源于stack exchange,提问作者Valentin Tanasescu
相关产品推荐
相关产品推荐

