Composer 文档提供了两个基本示例。我会尽力解释:
列出被此包替换的包。这允许您分叉一个包,以具有自己版本号的不同名称发布它,而需要原始包的包继续使用您的分叉,因为它替换了原始包。
假设您的软件使用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.0.2"
}
现在 Composer 知道,在解决 other/package 的依赖关系时,来自 better/library 的任何包都与 original/library 一样好。
这对于包含子包的包也很有用,例如主 symfony/symfony 包包含所有 Symfony 组件,这些组件也可作为单独的包使用。如果您需要主包,它将自动满足单个组件之一的任何要求,因为它会替换它们。
相同的规则,稍微不同的角度:对于需要某些功能的任何其他组件来说,需要框架的组件是一种很好的方法。但是,如果您需要软件中的完整框架,以及另一个库,该库随后也需要该框架的组件,则该框架的 replace 声明允许 Composer 不必安装该单个组件两次,因为它已经包含在内在完整的框架中。
注意:替换版本中的占位符通常不好
在我原来的回答中我建议:
"replace": {
"original/library":"1.*"
}
这会带来后果:Composer 现在会将您的库版本 1.0.0 视为与原始库的任何版本 1.x 一样好,即使他们修复了某些内容或添加了功能并在某天发布了版本 1.2.34。这也意味着,如果您的 other/package 某天得到更新并需要 original/library:^1.1,则 YOUR 库中的替换仍然有效,并声明它可以替换任何版本 1.*,即使没有您更新里面的任何东西 - 它不能,如果你不做一些工作,你的旧代码永远不会实现原始库的新功能,但替换说明正是这一点。
所以本质上:在替换版本中避免使用通配符版本!如果你使用它们,你就会对你无法知道或预测的未来发表声明(除非你可以控制original/library,但即便如此也要非常小心)。始终使用您知道并且可以完全重新实现的特定版本的original/library。