依赖管理(Dependency Management)是软件工程中的一个重要概念,旨在管理和控制软件组件或库之间的依赖关系,以确保程序能够正确运行

在现代软件开发中,应用程序通常利用许多开源组件和库,这些组件和库存放在中央仓库中,并且它们之间存在复杂的依赖关系

因此,一个成功的项目需要一个强大的依赖管理系统来管理这些依赖项,确保应用程序的正确性

Composer

Composer

Composer 是 PHP 的依赖管理工具,它为你解决下列问题:

  • 你有一个项目依赖于若干个库
  • 其中一些库依赖于其他库
  • 你声明你所依赖的东西
  • 找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)

要想使用 Composer,就必须要一个 composer.json 文件,该文件包含了项目的依赖和其它的一些元数据

文件详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"name": "liluoao/api-doc",
"description": "Generate API doc from PHPDoc.",
"keywords": [
"api-documentation",
"phpdoc"
],
"homepage": "https://github.com/liluoao/api-doc",
"authors": [
{
"name": "Li Luoao",
"email": "liluoao@qq.com",
"homepage": "https://github.com/liluoao",
"role": "Developer"
}
],
"time": "2018-02-11",
"license": "MIT",
"type": "library",
//要求 包括环境与依赖包
"require": {
"php": ">=5.4.0",
"ext-json": "*"
}
}

当项目有测试时,可以使用如下属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"require-dev": {
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"orchestra/testbench": "3.7.6",
"phpunit/phpunit": "7.5.1",
"phpbench/phpbench": "^0.17.0"
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"test": "vendor/bin/phpunit",
"test-coverage": "vendor/bin/phpunit --coverage-html coverage"
}
}

像 Laravel 的数据填充并没有写命名空间,是直接在此定义的,还有帮助函数的文件等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"files": [
"src/helper.php"
],
"psr-4": {
"Liluoao\\ApiDoc\\": "src"
},
}
}

可以自动添加包里的服务提供者

1
2
3
4
5
6
7
8
9
10
11
12
{
"extra": {
"laravel": {
"providers": [
"Liluoao\\Providers\\ServiceProvider"
],
"dont-discover": [
"barryvdh/laravel-ide-helper"
]
}
}
}

Packagist

Packagist 是包存储库,也是 Composer 的主要资源库

在 Submit 页填写你的项目地址,并在你的项目设置中开启 packagist 服务,让代码同步更新:

GitHub项目开启服务

以上面例子项目发布成功后结果如下图所示

成功示例

镜像

由于网络原因,下载包的速度很慢,可以替换为国内镜像提高速度:Packagist 镜像使用方法

2019-07 更新

《Laravel China 镜像完成历史使命,将于两个月后停用》
《Composer 国内加速:可用镜像列表 》

Satis 管理私有资源

  • 由于公司的架构是内外网分离,开发在内部局域网,无法拉取到公网的 Packagist
  • 顺便维护一些私有的包

好在 Composer 官方提供了这样的静态代码库生成器——Satis

1
composer create-project composer/satis --stability=dev --keep-vcs

Satis 的配置是通过 satis.json 进行的

satis.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"name": "crm",
"homepage": "http://10.0.20.252:10450",//本项目地址,可以WEB访问
"config": {
"disable-tls": true,
"secure-http": false
},
//镜像缓存设置,该设置会缓存require配置项中各个仓库的代码
"archive": {
"directory": "dist"//目录名
},
"require": {
"monolog/monolog": "1.24.0"
//...
},
"require-all": false,//为true时将从仓库获取所有相关的依赖包
"repositories": [
{
"type": "git",
"url": "http://10.0.20.254:10080/library/monolog/monolog.git"
}
//...
]
}

生成项目

1
2
3
php bin/satis build satis.json public/
# 添加新的repo
php bin/satis add http://10.0.20.254:10080/library/guzzlehttp/guzzle.git satis.json

使用静态库时修改 composer.json 文件

composer.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"repositories": [
{
"packagist": false
},
{
"type": "composer",
"url": "http://10.0.20.252:10450"
}
],
"config": {
"disable-tls": true,
"secure-http": false//非HTTPS
}
}