仓库优先级#

规范仓库#

当 Composer 解析依赖项时,它会首先在最顶层的仓库中查找给定的包。如果该仓库不包含该包,它会继续查找下一个仓库,直到找到包含该包的仓库为止,然后该过程结束。

规范仓库在几个方面更有优势

  • 从性能角度来看,一旦找到某个包,停止搜索会更有效率。它还可以避免加载重复的包,以防同一个包出现在多个仓库中。
  • 从安全性角度来看,将它们视为规范更安全,因为这意味着你期望来自最重要的仓库的包永远不会从其他仓库加载。假设你有一个非规范的私有仓库,并且你要求你的私有包 `foo/bar ^2.0`,例如。现在,如果有人在 packagist.org 上发布了 `foo/bar 2.999`,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"]
        }
    ]
}

`only` 和 `exclude` 都应该是包名称的数组,其中也可以包含通配符(`*`),它将匹配任何字符。

发现错别字了吗?这个文档中有什么错误?分叉并编辑它!