“替换”属性如何与作曲家一起使用?

时间:2013-09-18 20:55:52

标签: replace composer-php package-managers

那么“replace”属性如何与composer一起使用?我读过作曲家的文档,但仍然不理解。搜索更多信息没有回答我的问题。

当我在github上查看Laravel/Framework上的composer.json文件时。我看不出替换会如何工作。有人可以向我解释这是如何工作的吗?变量“self.version”将等于什么?

2 个答案:

答案 0 :(得分:70)

Composer文档提供了两个基本示例。我会试着解释一下:

  

列出由此软件包替换的软件包。这允许您分叉包,使用其自己的版本号以不同的名称发布它,而需要原始包的包继续使用您的fork,因为它替换了原始包。

假设您的软件使用original/libraryother/package,它本身也需要original/library

现在您认为original/library需要集成一项功能,但维护人员不会在您的程序包中发布您的建议。您决定以名称better/library分叉该库,并标记新版本。

返回您的软件。当然它应该开始使用better/library,因此您需要这样做,但other/package仍然需要original/library - 代码重复!如何让其他软件包使用你的better/library而不用它而只更改composer.json(你仍然与original/library兼容,所以它应该有效)?

您为composer.json添加了替换密钥:

"replace": {
    "original/library":"1.*"
}

现在,Composer知道,在解析better/library的依赖关系时,original/library中的任何包都与other/package一样好。

  

这对于包含子包的包也很有用,例如,主symfony / symfony包中包含所有Symfony组件,这些组件也可作为单独的包提供。如果您需要主包,它将自动满足其中一个组件的任何要求,因为它取代了它们。

相同的规则,略有不同的角度:对于需要某些功能的任何其他组件,需要框架的组件是一种很好的方法。但是如果您需要软件中的完整框架和另一个库(后来也需要该框架的组件),框架的replace声明允许Composer不必安装两次单个组件,因为它是已经包含在完整的框架中。

答案 1 :(得分:4)

当您创建自己的软件包时,您在composer.json中定义了哪些软件包provide基本上告诉 Composer 您的软件包已经安装了它,所以无需再次安装。

如果您使用replace property,它会告诉Composer您的软件包想要用您自己的fork替换原始软件包,因此其他软件包不需要安装它。

例如,如果a/a包需要b/b并且您告知替换b/b,则不会在Composer install / update上下载。{ / p>

这里有更详细的解释:How does the “replace” property work in Composer?

How does the “replace” property work in Composer - diagram