首页 > PHP > Composer 中文文档 > 官方文章

3.9. 可执行二进制文件

Vendor 文件夹 和 vendor/bin 目录

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 以外的其他地方?

是的,有两种方式可以指定备用供应商二进制的位置:

  1. 在 composer.json 中设置 bin-dir 配置设置
  2. 设置环境变量 COMPOSER_BIN_DIR

前者的例子如下:

{
    "config": {
        "bin-dir": "scripts"
    }
}

为 composer.json 运行 composer install 将导致所有供应商二进制文件都安装在 scripts/ 而不是 vendor/bin/ 中。

您可以将 bin-dir 设置为 ./ 以将二进制文件放入项目根目录中。