别名 个人理解:Composer 为了 “兼容” VCS 提供不可比较的版本号。官方文档举例 Github 的 master 、bugfix 分支,在 Composer 里就成了不可比较的版本号。这样会造成的问题:如果 master 分支使用标签发布了 1.0.1、1.0.2、1.03 等 1.0 系列的版本,这个版本号都可以通过 Composer 的版本约束 1.0.* 来匹配到。但有人想要使用最新的 master 版本,版本约束 1.0.* 无能为力。
为了兼容 可比较版本 和 不可比较版本,Composer 采用 别名 解决这个问题。别名包括 分支别名 和 行内别名。Composer 在兼容 VCS 时会在不可比较的版本前加 dev-;在可比较版本后加 -dev。
分支别名
要使用分支别名(branch-alias),你需要对源码拥有控制权,并提交别名修改到你控制的版本库。例如:我现在本地项目要依赖 包A,那么我在版本控制系统(例如 github)里修改 包A 的composer.json,使用 extra 字段添加别名:
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
}
上面将 dev-master 别名为 1.0.x-dev,接上面的例子,使用版本约束 1.0.* 就可以通过匹配 1.0.x-dev 间接匹配 dev-master。
如果你不是 包A 的所有者,可以考虑将其 fork 到自己的版本库;如果既不是所有者也不想 fork,就使用下面的 行内别名。
行内别名
假设对 包A 没有控制权,通过 行内别名 匹配下载 dev-master 版本。修改本地项目根目录下的 composer.json 文件。
{
"require": {
"symfony/monolog-bundle": "2.0",
"monolog/monolog": "dev-master as 1.0.x-dev"
}
}
上面依赖两个包:symfony/monolog-bundle 和 monolog/monolog。通过对 monolog/monolog 版本约束 dev-master as 1.0.x-dev ,将其 dev-master 别名为 1.0.x-dev,就能满足 symfony/monolog-bundle 包对 monolog/monolog 包版约束为为 1.* 对要求。
动手一下
挑选两个包:valu/wp-testing-tools 和 monolog/monolog,monolog/monolog 包定义了 分支别名,valu/wp-testing-tools 包有不可比较版本 dev-master 和 dev-stable。 monolog/monolog 包定义 dev-main 分支 别名为 2.x-dev。
"extra": { "branch-alias": { "dev-main": "2.x-dev" } },
1、使用 2.* 和 0.6.* 约束:
"require": {
"monolog/monolog": "2.*",
"valu/wp-testing-tools": "0.6.*"
}
查看到两个包都没有安装 dev-master,
monolog/monolog 2.2.0 Sends your logs to files, sockets, inboxes, databases and various web services
psr/log 1.1.4 Common interface for logging libraries
valu/wp-testing-tools v0.6.0 Testing tools for WordPress
2、使用 2.*@dev 和 0.6.*@dev 约束:
"require": {
"monolog/monolog": "2.*@dev",
"valu/wp-testing-tools": "0.6.*@dev"
}
两个包都加入了 dev 稳定性约束,2.*@dev 版本约束可以匹配到 monolog/monolog 包别名 2.x-dev,所以看到 monolog/monolog 包升级到了 dev-main 版本,valu/wp-testing-tools 包仍然处在 v0.6.0 版本。
monolog/monolog dev-main bac1ddd Sends your logs to files, sockets, inboxes, databases and various web services
psr/log 1.1.4 Common interface for logging libraries
valu/wp-testing-tools v0.6.0 Testing tools for WordPress
使用包详细信息命令:show 或 info,查看 monolog/monolog 包 versions 字段,可以看到版本号除了 dev-main,还有 2.x-dev。
versions : * 2.x-dev, * dev-main
而 valu/wp-testing-tools 包 versions 字段只有 0.6.0
versions : * v0.6.0
3、dev-master as 0.6.*-dev 约束:
"require": {
"monolog/monolog": "2.*@dev",
"valu/wp-testing-tools": "dev-master as 0.6.x-dev"
}
使用 行内别名,将 valu/wp-testing-tools 包 dev-master 别名为 0.6.x-dev 可以顺利安装上 dev-master。
monolog/monolog dev-main bac1ddd Sends your logs to files, sockets, inboxes, databases and various web services
psr/log 1.1.4 Common interface for logging libraries
valu/wp-testing-tools dev-master 9d2b038 Testing tools for WordPress