Heim >Entwicklungswerkzeuge >composer >Verwenden Sie das Attribut „replace', um Composer-Abhängigkeitskonflikte zu vermeiden

Verwenden Sie das Attribut „replace', um Composer-Abhängigkeitskonflikte zu vermeiden

藏色散人
藏色散人nach vorne
2021-03-12 11:28:593893Durchsuche

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 verwendet original/library und other/package, die ihrerseits original/library erfordern.

Jetzt denken Sie, dass original/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 Namen better/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/libraryother/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

Sie müssen das Schlüsselwort „replace“ in composer.json hinzufügen:
rrreee

Jetzt 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.
🎜🎜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 die 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen