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

Ily*_*512 44 replace package-managers composer-php

那么" 替换 "属性如何与作曲家一起工作?我读过作曲家的文档,但仍然不理解.搜索更多信息没有回答我的问题.

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

Sve*_*ven 75

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.0.2"
}
Run Code Online (Sandbox Code Playgroud)

现在,Composer知道你的任何软件包都与解决它的依赖关系better/library一样好.original/libraryother/package

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

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

  • 我想我差不多明白了。所以我不明白的是,composer 如何知道要替换什么(将 a 包替换为 b 或将 c 包替换为 d),但是 Composer 会查看类名来进行比较,对吗?因此任何名为 a/b 的包都会被 x/b 或 y/b 替换。添加 self.version 可能意味着仅在版本号相等时才进行替换。 (3认同)

ken*_*orb 5

创建自己的程序包时,您可以定义您使用composer.json哪种程序包,provide这基本上会告诉Composer您的程序包已经安装了,因此无需再次安装。

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

例如,如果a/a软件包需要b/b并且您告诉您要替换b/b,则它将不会在Composer install/ 上下载update

此处有更详细的说明:Composer中的“替换”属性如何工作?

Composer中的“替换”属性如何工作-图表