跳转到内容

仓库优先级

当Composer解析依赖项时,它会在最顶层的仓库中查找指定的包。如果该仓库不包含这个包,它会继续查找下一个仓库,直到某个仓库包含该包,此过程才会结束。

规范仓库更优的原因有以下几点:

  • 从性能角度而言,一旦在某个地方找到了某个包,就停止继续寻找会更高效。这也能避免在同一个包存在于多个仓库中的情况下加载重复的包。
  • 从安全角度而言,规范地处理它们更为安全,这意味着你期望从最重要的仓库获取的包,绝不会转而从其他仓库加载。例如,假设你有一个非规范的私有仓库,并且你需要自己的私有包foo/bar ^2.0。此时,如果有人向packagist.org发布了foo/bar 2.999,由于这个版本号高于你的最新版本(比如2.4.3),Composer会突然选择这个包,结果你可能会安装并非自己本意想要的东西。但是,如果这个私有仓库是规范的,那么来自packagist.org的2.999版本根本不会被考虑。

然而,在某些情况下,你可能希望从特定的仓库中专门加载一些包,而不是所有包。或者,你可能希望某个给定的仓库不是标准的,并且只有当它的包版本高于下面定义的仓库时才优先选择。

在Composer 2.x中,默认所有仓库都是规范的。Composer 1.x则将所有仓库视为非规范的。

另一个默认设置是,除非您禁用它,否则packagist.org仓库总会被隐式添加为最后一个仓库。

你可以向任何仓库添加规范选项,以禁用此默认行为,并确保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都应该是包名数组,其中也可以包含通配符(*),该通配符可匹配任何字符。