儲存庫優先順序#

典型儲存庫#

當 Composer 解析相依關係時,它會在最上層儲存庫中查詢特定套件。如果該儲存庫不包含該套件,則會繼續到下一個儲存庫,直到其中一個儲存庫包含該套件,而程式便結束。

典型儲存庫較好的原因如下

  • 在效能方面,一旦在某處找到套件,就不再搜尋該套件更為有效率。它也可以避免載入重複的套件,以防同一個套件存在於多個儲存庫中。
  • 在安全性方面,將它們視為典型較為安全,因為這表示您預期來自最重要的儲存庫的套件絕不會從其他儲存庫載入。假設您有一個非典型的私人儲存庫,而且您需要您的私人套件 foo/bar ^2.0,例如。現在,如果有人將 foo/bar 2.999 發佈到 packagist.org,Composer 會突然選擇該套件,因為它的版本高於您最新的版本(例如 2.4.3),最後您會安裝您可能不想要安裝的內容。但是,如果私人儲存庫為典型,則 packagist.org 的 2.999 版本將完全不被考慮。

然而,在某些情況下,您可能特別想從指定的儲存庫載入某些套件,但並非所有。或者,您可能希望某個儲存庫不要為典型,而且只有在其套件版本比下方定義的儲存庫版本高時,才優先考慮該儲存庫。

預設行為#

預設在 Composer 2.x 中,所有儲存庫都是典型的。Composer 1.x 將所有儲存庫都視為非典型。

另一個預設是,packagist.org 儲存庫會始終被隱式加入為最後一個儲存庫,除非您停用它。

將儲存庫設為非典型#

您可以將 canonical 選項加入任何儲存庫,以停用此預設行為,並確保 Composer 繼續在其他儲存庫中搜尋,即使該儲存庫包含指定的套件。

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://example.org",
            "canonical": false
        }
    ]
}

篩選套件#

你也可以篩選存放庫可以載入的套件,方法是選擇想要的套件,或排除不需要的套件。

例如,我們想從這個 Composer 存放庫中只選取套件 foo/bar 和來自 some-vendor/ 的所有套件。

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://example.org",
            "only": ["foo/bar", "some-vendor/*"]
        }
    ]
}

而在這個其他範例中,我們從存放庫中排除 toy/package,因為我們可能不想要在這個專案中載入它。

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://example.org",
            "exclude": ["toy/package"]
        }
    ]
}

onlyexclude 都應該是要包含套件名稱的陣列,也可以包含萬用字元 (*),它會比對任何字元。

找到錯字嗎?這份文件中有些錯誤嗎?分支並編輯它!