那么“replace”属性如何与composer一起使用?我读过作曲家的文档,但仍然不理解。搜索更多信息没有回答我的问题。
当我在github上查看Laravel/Framework上的composer.json文件时。我看不出替换会如何工作。有人可以向我解释这是如何工作的吗?变量“self.version”将等于什么?
答案 0 :(得分:70)
Composer文档提供了两个基本示例。我会试着解释一下:
列出由此软件包替换的软件包。这允许您分叉包,使用其自己的版本号以不同的名称发布它,而需要原始包的包继续使用您的fork,因为它替换了原始包。
假设您的软件使用original/library
和other/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>