项目背景

我司一个项目这里简称:神居,分为C端(「代号:mooncake」),“平台端”「代号:internal」,B端「代号:agent」,“任务端”「代号:script」,为了保护公司隐私,这里不方便介绍每个项目处理的业务,你只需要知道的是每个代号代表一个独立运行的项目,那么这些项目又如果做到代码的复用(Library/Model)呢,且需要做到每个项目可独立迭代更新。我们现采用的方式就是composer管理私有包的方式。

这里也有一篇描述Composer安装私有PHP软件包文章,以下我部分步骤翻译自这篇文章。

Composer安装私有PHP软件包

使用Composer安装私有PHP软件包。首先我们需要在composer.json文件中进行一些额外的配置,然后设置SSH密钥。按照以下3个简单步骤进行操作

1. 指向Git仓库

更新composer.json并添加一个存储库:

1
2
3
4
5
6
"repositories":[
    {
        "type": "vcs",
        "url": "git@github.com:barryvanveen/secret.git"
    }
]

这里url,可以是gitlab或者其他地址(可别犯傻)。

2.创建一个SSH密钥

在要安装软件包的计算机上创建一个SSH密钥,如果感觉自己既要配置gitlab又要配置github等等其他的SSH秘钥,如何共存使用,可以参考我的这篇文章传送门

如果您在开发机器上工作,则可能要将SSH密钥添加到GitHub / BitBucket / GitLab帐户。这样就可以访问您帐户有权访问的所有私有存储库。

将SSH密钥添加到GitHub帐户 将SSH密钥添加到BitBucket帐户 将SSH密钥添加到GitLab帐户

如果要配置部署服务器,则最好配置访问密钥或部署密钥。访问密钥仅提供对单个存储库的访问,因此可以进行更具体的访问管理。

将部署密钥添加到GitHub存储库 将访问密钥添加到BitBucket存储库 将部署密钥添加到GitLab存储库

你肯能会问,开发机器和部署服务器使用同样的SSH秘钥不就完事了嘛,搞这么麻烦干啥,因为开发机器的秘钥对repo拥有写的权限,而部署服务器只需拥有repo的读权限即可了,还是建议共用的做法。

3.运行作曲家

现在只需composer requirecomposer install像往常一样打包。

这里值得提一下 composer require 指定版本时,会同时更新 composer.json 中对应的版本号,composer update 则不会

警告:向已知主机添加SSH指纹

首次在新主机名上使用SSH密钥时,它将显示如下警告:

1
2
3
The authenticity of host '123.123.123.123 (123.123.123.123)' can't be established.
RSA key fingerprint is a1:b2:c3:d4:e5:f6:6f:5e:4d:3c:2b:1a:00:11:22:33.
Are you sure you want to continue connecting (yes/no)?

这是额外的保护层,可防止您错误地连接到未知主机。但是,如果要使用SSH密钥自动执行任务,则确实会带来一些问题。

这就是为什么我们要手动触发此警告,并避免将来再次弹出它。可以使用以下命令完成此操作:

1
ssh -T git@github.com

当然,您应该用repo私有存储库的主机名替换掉git@github.com。此命令将调用上面列出的警告。您可以使用GitHub / BitBucket / GitLab帐户中的指纹列表来验证指纹。

确认此警告后,SSH指纹将被添加到已知主机列表中,这将防止警告再次弹出。

案例分享

mooncake为例,一下是相关的composer.json配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  "require": {
    ...
    ...
    "neox/lib": "2.9.0",
    "neox/model": "1.6.1"
  },

  "repositories": {
    "neox-lib": {
      "type": "vcs",
      "url": "git@git.neox-inc.com:be-sushi/neox-library.git"
    },
    "neox-model": {
      "type": "vcs",
      "url": "git@git.neox-inc.com:be-sushi/neox-model.git"
    },

使用私有库的开发技巧

抛出问题:我们晓得私有库都有独立的repo,还以mooncake项目为例那我们在本地开发需要改动私有库libmodel下代码,那么改完后如何测试?私有库放哪里?是直接动手改vendor/neox/lib,还是改独立目录下与mooncake项目平级lib库代码(假设我们将私有库lib克隆到与mooncake平级目录),如果改的是后者如何使其改过的代码生效呢?好了~不买官司了。接下分享一下我采用的方式:

方案一 私有仓库lib和项目mooncake平级(不是必须),配置composer达到指定使用私有库lib分支代码,修改代码以后需要把修改后的代码requirevendor目录下,我们可以composer.json配置达到从本地指定私有lib目录,将指定分支代码requirevendor,而不是从gitlab下载。

缺点:每次改动私有的lib库代码,都需要composer install,还需先删除composer.lock文件再install。刚一开始我采用的这种方案,你会发现每次的install,都要执行一堆没用的(效率太低,不推荐)。以下是这种方案我的composer.json配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  "require": {
    ...
    ...
    "neox/lib": "dev-feature/20200323-db-rename-namespace",
    "neox/model": "dev-feature/20200323-db-rename-namespace",
  },
  "repositories": {
    "neox-lib": {
      "type": "vcs",
      "url": "../lib"
    },
    "neox-model": {
      "type": "vcs",
      "url": "../model"
    }
  }  

注意:实际libmodel代码分支名是feature/20200323-db-rename-namespace

方案二

直接修改vendor目录下的libmodel,修改前可以通过git分支自行创建和切换分支以维护不同的代码,将此目录下的代码直接作为libmodel的本地开发仓库(其实本来也就是了)。这种方式改完代码及时生效无需执行composer任何命令,因为vendor下的代码包本来也就已经被处理好了autolaod。此种方式也是我现在采用的方法,推荐。

最后贴一下,我司私有库的composer.json配置图(因为隐私我做了部分模糊):

私有库Lib:

lib-u

私有库Model:

lib-u

最终被composer处理后的psr-4目录映射形式:

lib-u

好文同享