出现composer git submodule背景
在php项目中,使用composer引入新的扩展的时候遇到了一个错误,三方扩展变成了这个项目的子项目,提交代码之后,这个扩展编程了git submodule,实际上我们提交之后的不是一个目录,vendor里面的这个项目是一个空的文件,导致线上引入资源而出现了故障。
在网上搜索了一下这个问题《composer安装后插件被当成GIT submodule(GIT子项目)》?网上给了三种解答,但是都不能解答我的问题,一方面他们说的不准确,还有可能说的不仔细吧。
出现这个问题的原因
composer在添加新的资源你的时候,如果项目是git仓库托管的,是通过git clone将代码拉至本地vendor目录的,所以该文件下会有一个.git的目录,这个其实是多余的,如果一个git托管的项目中再次出现git托管的项目,那么这个子项目就会被当做submodule被提交,
这里就不介绍git submodule了。
解决方案
如果解决这个问题呢?当然是直接删除扩展的.git目录了啦!需要每次手动将这个目录删除?每次更新之后还要删除?那么多的扩展都要一个一个的删除?
如果你很了解composer的处理机制的话,这些事情就变得十分的简单了。
composer.json中,我们可以在composer中自定义,composer处理过程中添加自己的钩子函数。脚本如下:找到vendor项目中所有的.git文件,然后执行rm -rf,即可。
find vendor -type d -name .git -exec rm -rf '{}' \;
composer.json的内容如下,在post-install-cmd和post-update-cmd执行之后执行我们的shell脚本:
{
"scripts": {
"post-install-cmd": [
"find vendor -type d -name .git -exec rm -rf '{}' \\;",
],
"post-update-cmd": [
"find vendor -type d -name .git -exec rm -rf '{}' \\;",
]
},
}