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

那么“替换”属性如何与作曲家一起工作? 我已经阅读了作曲家的文档,但仍然不明白。 搜索更多信息尚未回答我的问题。

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

Ilyes512 asked 2020-07-31T04:21:38Z
2个解决方案
74 votes

Composer文档提供了两个基本示例。 我将尝试解释:

列出被该软件包替换的软件包。 这样,您就可以派生一个包,并使用自己的版本号以不同的名称发布它,而需要原始包的包可以继续使用您的派生,因为它将替换原始包。

假设您的软件使用original/libraryoriginal/library,它们本身也需要1.*

现在,您认为original/library需要集成功能,但是维护人员不会在您的包装中出现您的建议。 您决定将该库命名为original/library,并标记一个新版本。

回到您的软件。 当然,它应该开始使用original/library,因此您需要这样做,但是original/library仍然需要1.*-代码重复! 您如何才能使其他软件包使用您的2990230226866799799619来代替它,而无需也分叉它而仅更改composer.json(您仍然与该original/library兼容,因此应该可以使用)?

您将替换密钥添加到original/library

"replace": {
    "original/library":"1.0.2"
}

现在,Composer知道,在解决1.*的依赖项时,来自2990230226866766799616的任何程序包都与2990230226866866799617一样好。

这对于包含子软件包的软件包也很有用,例如,主要的symfony / symfony软件包包含所有Symfony组件,这些组件也可以作为单独的软件包使用。 如果您需要主包装,它将自动满足单个组件之一的要求,因为它将替换它们。

相同的规则,只是角度略有不同:对于需要某些功能的任何其他组件,要求框架的组件是一种不错的方法。 但是,如果您需要软件中的完整框架以及另一个需要该框架组件的库,则该框架的2990230226866766799616声明使Composer不必两次安装该单个组件,因为该组件已经包含在其中。 完整的框架。

当心:替换版本中的占位符通常是不好的

在我的原始答案中,我建议:

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

这会带来后果:Composer现在会将您的库1.0.0版与原始库的任何1.x版一样好,即使他们修复某些东西或添加功能并有一天发布1.2.34版也是如此。 这也意味着,如果某天您的2990230226866766799616得到更新并需要original/library,则您库中的替换仍处于活动状态,并指出它可以替换任何版本1.*,即使您不更新内部内容也不能,您的旧代码将 在不做任何工作的情况下,切勿实现原始库的新功能,但替换内容恰恰说明了这一点。

所以本质上:在替换版本中避免使用通配符版本! 如果使用它们,则会对无法知道或无法预测的未来做出陈述(除非您可以控制2990230226866766799616,但即使这样也要非常小心)。 始终使用您知道的特定版本的2990230226866866799617,并且可以完全重新实现。

Sven answered 2020-07-31T04:22:51Z
5 votes

创建自己的程序包时,您可以在a/a中定义它是哪种程序包a/a,这基本上告诉Composer您的程序包已安装,因此无需再次安装。

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

例如,如果a/a软件包需要b/b,而您告诉您更换b/b,则它不会在Composer install/update上下载。

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

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

kenorb answered 2020-07-31T04:23:25Z
translate from https://stackoverflow.com:/questions/18882201/how-does-the-replace-property-work-with-composer