一般我们开发项目, 不可避免的需要使用别的第三方库, java有maven, python有pip, go有go get, javascritp有npm,
当然作为世界上最好的语言PHP有composer, 看上去是那么的美好.😄. 今天用composer安装自己写的一个依赖, 发现有坑.
……….

写在前面的话

场景, 有快业务代码, 很多很多个项目都要调用, (比如业务监控代码, 需要在个个业务中调用), 理所当的想把它封装成一个composer包(针对php开发)
然后其他项目只要composer require monitorpkg即可, 然后将代码加入到仓库, 和项目一起发布OK了,
(一般我们都把vendor目录下一起加入到仓库. 1. 方便前端同学 一起开发, 总不能让前端同学一安装composer吧. 2. 线上发布也简单, 当然你可以说发布后挂个钩子, composer update一下也很简单, 但实际情况不会理想, 曾经我们项目就是这样做, 发现每次发布项目要等好几分钟, 随着项目变大, 10多分钟才发布OK, 这绝对不是你想要的)
问题来了, 我发现composer install monitorpkg的代码不能加入到项目仓库. ~~~

原因追踪

composer install下来的第三方包不能加入仓库, 没道理, 以前也是这么干的呀, cd到安装的第三方包目录下(vendor/organization/monitorpkg) ls -a 发现.git目录也
down下来了? 为什么?

composer仓库类型

composer 仓库地址有类型有4类别

  • Composer
  • VCS
  • PEAR
  • Packages

一般我们使用的的composer类型, 安装的包不会有.git目录, 但项目是私有项目, 图个方便, 直接使用vcs类型了, 发现使用vcs类型会把项目的.git目录也down下来
我们知道, 单个项目git仓库中只能有.git目录, 由于composer安装的第三方包也有.git目录, 因此项目直接忽略了第三方包了.

composer.json 文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"name": "luowen/test",
"authors": [
{
"name": "luowen",
"email": "bigpao.luo@gmail.com"
}
],
"repositories": [
{
"type": "vcs",
"url": "https://github.com/vvotm/zqim.git"
}
],
"require": {
"luowen/zqphplib": "dev-master"
}
}

怎么解决呢, 办法肯定是有的.

  1. 使用git submodule实现

    添加我们写的第三方包的git地址作为项目的子模块可参考gitsubmodule documention, Working with submodules

    1
    2
    $ cd vendor/organiztion/
    $ git submodule add https://my-privite-gitrepo.com/mycustomer-package.git monitorypkg

    还没完事, 每次发布项目后 需要执行 git submodule update --init --recursive 把子模块的项目代码拉去下来
    很显然, 这不是我们想要的

  2. 使用Composer官方Satis 搭建私有composer仓库, 将composer repositios 换成 composer类型, 例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    {
    "name": "luowen/test",
    "authors": [
    {
    "name": "luowen",
    "email": "bigpao.luo@gmail.com"
    }
    ],
    "repositories": [
    {
    "type": "composer",
    "url": "http://youpackage.domain.com"
    }
    ],
    "require": {
    "luowen/zqphplib": "dev-master"
    }
    }

关于更多的gitsubmodule例子(拆分项目成多个子模块, 等等..)参考gitsubmodule, Working with submodules
综合考虑尽量避免使用gitsubmodule这个功能, 成本比较高, 并没想的那么美好

欢迎拍砖, 我的disqus插件被强了, 一般人拍不了!😄😄😄