Heim >Entwicklungswerkzeuge >composer >Verwenden Sie das Attribut „replace', um Composer-Abhängigkeitskonflikte zu vermeiden
vorgestellt, um die Verwendung des Ersetzungsattributs vorzustellen, um die Abhängigkeitskonfliktmethode des Komponisten zu vermeiden. Ich hoffe, es wird den bedürftigen Freunden hilfreich sein! Die Composer-Dokumentation enthält zwei grundlegende Beispiele. Ich versuche es zu erklären:
Listen Sie die Pakete auf, die durch dieses Paket ersetzt werden. Auf diese Weise können Sie ein Paket forken und es unter einem anderen Namen mit Ihrer eigenen Versionsnummer veröffentlichen, und Pakete, die das Originalpaket erfordern, können Ihr geforktes Paket weiterhin verwenden, da es das Originalpaket ersetzt.
Angenommen, Ihre Software verwendetoriginal/library
undother/package
, die ihrerseitsoriginal/library
erfordern. Jetzt denken Sie, dassoriginal/library
neue Funktionen integrieren muss, aber die Betreuer sind mit Ihrem Vorschlag zur Implementierung in ihrem Paket nicht einverstanden. Sie beschließen also, die Bibliothek unter dem Namenbetter/library
zu forken und sie als neue Version zu kennzeichnen.
Zurück zur Software. Natürlich sollte das Paket better/library
verwendet werden, also verwenden Sie stattdessen dieses, aber other/package
erfordert immer noch den Code original/library
wiederholen! Wie bringen Sie dieses Paket dazu, Ihre better/library
anstelle von original/library
zu verwenden? Anstatt es zu forken und einfach „composer.json“ zu ändern (Sie sind immer noch mit original/library
kompatibel, also sollte es funktionieren)? original/library
和 other/package
,它们本身也需要 original/library
。
现在你认为 original/library
需要集成新功能,但是维护人员不同意你的建议在他们的软件包中实现。 所以你决定以 better/library
的名称派生该库,并标记一个新发行版。
回到软件。当然,它应该开始使用 better/library
包,所以要用它来代替,但 other/package
仍然需要 original/library
- 代码重复!如何让那个包使用你的 better/library
来代替 original/library
?而不需要对它进行 fork ,只需要修改 composer.json(你仍然与 original/library
兼容,所以它应该可以工作了)?
你需要增加 replace 关键字在 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」,你库中的替换仍处于活动状态,并声明它可以替换任何版本 1*
,,即使你不更新内部的任何内容-这样做也无法完成,但是如果你不做任何工作,你的旧代码就永远不会实现原始库的新功能,但替换内容恰恰说明了这一点。
因此,从本质上讲:在替换版本中避免使用通配符版本! 如果使用它们,则会对你无法了解或预测的未来做出声明(除非你可以控制 original/library
,但即使这样也要非常小心)。 一定要使用你知道的并且可以完全重新实现的 original/library
composer.json
hinzufügen: rrreee🎜🎜Gleiche Regeln, nur eine etwas andere Perspektive: Wie bei jeder anderen Komponente, die eine gewisse Funktionalität benötigt, ist die Einführung der Komponenten des Frameworks ein guter Weg. Wenn Sie jedoch ein vollständiges Framework in Ihrer Software benötigen und eine andere Bibliothek eine Komponente dieses Frameworks benötigt, erspart dieJetzt weiß Composer, dass beim Auflösen von Abhängigkeiten von „other/package“ jedes Paket aus „better/library“ „original“ sein wird /library“ ist genauso gut.
Dies ist auch für Pakete nützlich, die Unterpakete enthalten, z. B. enthält das Hauptpaket Symfony/Symfony alle Symfony-Komponenten, die auch als separate Pakete verfügbar sind. Wenn Sie das Hauptpaket benötigen, erfüllt es automatisch die Anforderungen für eine der Einzelkomponenten, da es diese ersetzt.
replace
-Deklaration des Frameworks Composer die doppelte Installation dieser einzelnen Komponente, da sie bereits in einem vollständigen Framework enthalten ist rahmen. 🎜🎜🎜 HINWEIS: Das Ersetzen von Platzhaltern in Versionen ist im Allgemeinen schlecht 🎜🎜🎜 In meiner ursprünglichen Antwort habe ich Folgendes vorgeschlagen: 🎜rrreee🎜 Die Konsequenz daraus ist: Composer wird Ihre Bibliothek jetzt auf 1.0 versionieren. 0 ist so gut wie jede Version 1.x der ursprünglichen Bibliothek, auch wenn sie eines Tages etwas korrigierten oder einige Funktionen hinzufügten und Version 1.2.34 veröffentlichten. Das bedeutet auch, dass, wenn Ihr „other/package“ eines Tages aktualisiert wird und „original/library:^1.1“ erfordert, die Ersetzung in Ihrer Bibliothek immer noch aktiv ist und erklärt, dass sie jede Version 1*
ersetzen kann >, auch wenn Sie darin nichts aktualisieren – es wird nicht durchgeführt, aber wenn Sie keine Arbeit leisten, wird Ihr alter Code niemals die neue Funktionalität der Originalbibliothek implementieren, aber der Ersatzinhalt veranschaulicht genau dies . 🎜🎜Also grundsätzlich: Vermeiden Sie Wildcard-Versionen in Ersatzversionen! Wenn Sie sie verwenden, machen Sie Aussagen über die Zukunft, die Sie nicht kennen oder vorhersagen können (es sei denn, Sie haben die Kontrolle über original/library
, aber seien Sie selbst dann sehr vorsichtig). Stellen Sie sicher, dass Sie ein Original/eine Bibliothek
verwenden, das Sie kennen und vollständig neu implementieren können. 🎜🎜🎜Originaladresse: https://stackoverflow.com/questions/18882201/how-does-the-replace-property-work-with-composer🎜🎜Übersetzungsadresse: https://learnku.com/laravel/t/ 55200🎜🎜Das obige ist der detaillierte Inhalt vonVerwenden Sie das Attribut „replace', um Composer-Abhängigkeitskonflikte zu vermeiden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!