首頁  >  文章  >  開發工具  >  使用replace屬性來避免Composer的依賴衝突

使用replace屬性來避免Composer的依賴衝突

藏色散人
藏色散人轉載
2021-03-12 11:28:593829瀏覽

Composer 文件提供了兩個基本的範例。我將嘗試解釋:列出被該軟體包替換的軟體包。這樣,你就可以 fork 一個包,並使用自己的版本號以不同的名稱發布,而需要原始包的軟體包可以繼續使用你的 fork 包,因為它會替換原始包。


假設你的軟體使用

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<pre class="brush:php;toolbar:false">&quot;replace&quot;: {     &quot;original/library&quot;:&quot;1.0.2&quot; }</pre>現在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

原文網址:https://stackoverflow.com/questions/18882201/how-does-the-replace-property-work-with-composer#翻譯網址:https: //learnku.com/laravel/t/55200

#

以上是使用replace屬性來避免Composer的依賴衝突的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除