Mr-houzi 5年前

修改理由:

语序有误,错别字

此投稿已在 5年前 合并。

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
1  
21在创建 PHP 的应用程序或库时,通常有三种依赖关系:
32
43* 硬依赖性:你的应用程序/库需要此依赖才能够正常运行
54* 可选的依赖关系:例如一个 PHP 库可以为不同的框架提供一个功能
6 * 开发依赖:调试工具,测试框架等...
 5* 开发依赖:调试工具,测试框架等...
76## 如何管理这些依赖关系?
87
98<div class="text-center"><img src="https://cdn.learnku.com/uploads/images/201801/10/1/oIypZMwgdG.png" width="300" /></div>
 
4140截止到目前还是很顺利。那么什么地方会出错呢? 主要在 `require-dev` 上会有一定的限制。
4241
4342
44 
 43
4544## 问题和限制
4645
4746### 过多的依赖关系
 
5352**觉得段落长,直接看这里:** 对你引入的依赖进行负责,并且争取少依赖。
5453
5554
56 
 55
5756
5857### 强关系冲突
5958
 
8584在某些情况下可能会工作但是很可能大部分的情况下都会失败. 这种场景可能有点傻因为你不 _太_ 可能在同一时间同时包含这两个包并且你更不可能想要去支持这个场景.
8685
8786
88 
 87
8988### 无法测试的依赖关系
9089
9190请看示例 `composer.json`:
 
119118至少现在你是无法知道的。
120119
121120
122 
 121
123122
124123## 解决方案
125124
 
168167
169168使用PHAR时还有一些其他的事情需要记住:
170169
171 * 它们很难跟踪,因为在Composer 中没有原声的支持对于它们。然而,存在一些解决方案例如这个Composer 插件[tooly-composer-script](https://github.com/tommy-muehle/tooly-composer-script) 或者[PhiVe](https://phar.io/) 一个PHAR 安装程序
 170* 它们很难跟踪,因为在Composer 中对于它们没有原生的支持。然而,存在一些解决方案例如这个Composer 插件[tooly-composer-script](https://github.com/tommy-muehle/tooly-composer-script) 或者[PhiVe](https://phar.io/) 一个PHAR 安装程序
172171* 如何管理版本取决于项目。 一些项目提供了一个具有不同稳定通道的“自我更新”命令,一些项目提供了独特的下载端点和最新版本,一些项目使用了GitHub发行版,并为每个版本发布了一个PHAR。
173172
174173
175 
 174
176175### 使用多个存储库
177176
178177迄今为止最流行的技术之一。因此,我们不需要在一个 `composer.json` 中要求所有的桥依赖关系,而是将这个包分解到多个存储库中。
 
183182
184183这种方法的主要优点是,它仍然相对简单,不需要任何额外的工具,除了最终存储库分配器像 [splitsh](https://github.com/splitsh/lite),例如 Symfony,Laravel 和 PhpBB。缺点是你现在有多个包来维护,而不是一个。
185184
186 
 185
187186
188187### 调整配置
189188
 
212211在我的经验中,它是有效的,但这导致了臃肿的测试脚本,在运行中它们相对缓慢,难以维护,对新的贡献者也不太友好.
213212
214213
215 
 214
216215
217216### 使用多个composer.json
218217
 
306305所以现在我们可以调用 `vendor-bin / phpstan / vendor / bin / phpstan` 和 `vendor-bin / phpmetrics / vendor / bin / phpstan` 来轻松地使用PhpStan和PhpMetrics。
307306
308307
309 
 308
310309现在我们更进一步的以一个库在不同框架的引用为例
311310
312311```php
 
375374为了测试核心库之间的引用关系,你需要创建3个不同的单元测试文件,其中每一个都有 `autoload.php`(例如: Symfony 的引用文件 `vendor-bin/symfony/vendor/autoload.php`)。
376375
377376
378 
 377
379378如果你真的试试,你将会发现这种方法的一个主要缺点: 冗余配置。 确定你需要重复的根配置文件 `composer.json` 到其他两个 `vendor-bin/{symfony,laravel}/composer.json`, 调整自动加载变化的文件路径,当你需要一个新的依赖,你需要在其他的`composer.json`包含它。这是不可控的,所以 [composer-inheritance-plugin](https://github.com/theofidry/composer-inheritance-plugin)出现了。
380379
381380这个小包装插件[composer-merge-plugin](https://github.com/wikimedia/composer-merge-plugin)将`vendor-bin/symfony/composer.json`内容合并到根`composer.json`。所以不是如下:
 
406405其他的配置,自动加载和依赖将被包含在根 `composer.json` 。没有配置的, [composer-inheritance-plugin](https://github.com/theofidry/composer-inheritance-plugin)是一个瘦小的包[composer-merge-plugin](https://github.com/wikimedia/composer-merge-plugin)来预配置任何使用[composer-bin-plugin](https://github.com/bamarni/composer-bin-plugin)。
407406
408407
409 
 408
410409您可以检查安装它需要的依赖,通过:
411410   
412411   $ composer bin symfony show
413412
414413我在很多项目中使用这个方法,像[alice](https://github.com/nelmio/alice),不同于PhpStan和PHP-CS-Fixer这样的静态分析工具和框架桥接器。另一个例子是[alice-data-fixtures](https://github.com/theofidry/alicedatafixtures),其中有很多不同的ORM桥持久层(Doctrine ORM, Doctrine ODM, Eloquent ORM,等)和框架的整合。
415414
416 作为替代phars的另外一种工具,我在多个私人项目中使用了它,并且它工作得很好。
 415作为替代phars的另外一种工具,我在多个私人项目中使用了它,并且它工作得很好。
417416## 结论
418417
419418我相信有些人会发现一些奇怪的方法或不推荐使用它们。 这里的目标不是判断或者推荐一个特殊的东西,而是列出一些可能的方法来管理一些依赖关系,以及每个依赖关系的优点和缺点。 所以,根据你的问题和你的个人喜好,选择一个最适合你的。 正如人们所说,没有解决办法,只有权衡。