3.9. 可执行二进制文件
vendor 文件是什么?
任何一个 Composer 程序包想要传递给安装包的用户的命令行脚本都应该被列为 vendor 文件。
如果包包含了包用户不需要的其他脚本(如构建或编译脚本),则代码不应被列为 vendor 文件。
它是如何定义的?
它是通过将 bin
键添加到项目中来定义的 composer.json
。它被指定为文件数组,因此可以为任何给定项目添加多个二进制文件。
{
"bin": ["bin/my-script", "bin/my-other-script"]
}
在 composer.json 中定义供应商二进制文件有什么作用?
它指示 Composer 将程序包的二进制文件安装到 vendor/bin
依赖于该项目的任何项目中。
这是一种公开有用脚本的便捷方式,否则这些脚本将隐藏在 vendor/
目录中。
当 Composer 在定义供应商二进制文件的 composer.json 上运行时会发生什么?
对于包直接定义的二进制文件,没有任何反应。
当 Composer 在与列出的供应商二进制文件有依赖关系的 composer.json 上运行时会发生什么?
Composer 查找所有依赖项中定义的二进制文件。从每个依赖项的二进制文件到 vendor/bin
创建符号链接。
假设包 my-vendor/project-a
有二进制文件设置如下:
{
"name": "my-vendor/project-a",
"bin": ["bin/project-a-bin"]
}
为这个 composer.json
运行 composer install
不会对 bin/project-a-bin
做任何事情。
假设项目 my-vendor/project-b
的设置如下:
{
"name": "my-vendor/project-b",
"require": {
"my-vendor/project-a": "*"
}
}
为这个 composer.json
运行 composer install
将查看所有项目的二进制文件并将它们安装到 vendor/bin
。
在这种情况下,Composer 将使 vendor/my-vendor/project-a/bin/project-a-bin
可用作 vendor/bin/project-a-bin
。在类似 Unix 的平台上,这是通过创建符号链接来完成的。
那么 Windows 和 .bat 文件呢?
完全由 Composer 管理的包不需要包含任何 .bat
文件以实现 Windows 兼容性。在 Windows 环境中运行时,Composer 以特殊的方式处理二进制文件的安装:
- 自动生成
.bat
文件以引用二进制文件 - 将自动生成与二进制文件同名的 Unix 样式代理文件(对 Cygwin 或 Git Bash 很有用)
我们欢迎需要支持但可能不包含 Composer 工作流的软件来维护自定义的 .bat
文件。在这种情况下,程序包不应该将 .bat
文件列为二进制文件,因为它不需要。
是否可以将供应商二进制文件安装在 vendor/bin 以外的其他地方?
是的,有两种方式可以指定备用供应商二进制的位置:
- 在
composer.json
中设置bin-dir
配置设置 - 设置环境变量
COMPOSER_BIN_DIR
前者的例子如下:
{
"config": {
"bin-dir": "scripts"
}
}
为 composer.json
运行 composer install
将导致所有供应商二进制文件都安装在 scripts/
而不是 vendor/bin/
中。
您可以将 bin-dir
设置为 ./
以将二进制文件放入项目根目录中。