供应商二进制文件和 vendor/bin 目录#

什么是供应商二进制文件?#

任何 Composer 包希望传递给安装该包的用户的命令行脚本都应该列为供应商二进制文件。

如果包包含其他用户不需要的脚本(例如构建或编译脚本),则该代码不应该列为供应商二进制文件。

它是如何定义的?#

通过在项目的 composer.json 中添加 bin 键来定义它。它被指定为一个文件数组,因此可以为任何给定项目添加多个二进制文件。

{
    "bin": ["bin/my-script", "bin/my-other-script"]
}

在 composer.json 中定义供应商二进制文件会做什么?#

它指示 Composer 将包的二进制文件安装到所有**依赖**该项目的项目的 vendor/bin 中。

这是一种方便的方式来暴露有用的脚本,否则这些脚本会隐藏在 vendor/ 目录的深处。

当 Composer 在定义了供应商二进制文件的 composer.json 上运行时会发生什么?#

对于包直接定义的二进制文件,不会发生任何事情。

当 Composer 在依赖项包含供应商二进制文件的 composer.json 上运行时会发生什么?#

Composer 会查找所有依赖项中定义的二进制文件。从每个依赖项的二进制文件到 vendor/bin 创建一个代理文件(或 Windows/WSL 上的两个文件)。

假设包 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 会查看 project-a 的所有二进制文件并将它们安装到 vendor/bin

在这种情况下,Composer 会将 vendor/my-vendor/project-a/bin/project-a-bin 作为 vendor/bin/project-a-bin 提供。

从二进制文件中查找 Composer 自动加载器#

从 Composer 2.2 开始,bin 代理文件定义了一个新的 $_composer_autoload_path 全局变量,以便当您的二进制文件执行时,它可以轻松地使用它来定位项目的自动加载器。

但是,当运行由根包本身定义的二进制文件时,此全局变量将不可用,因此您需要有一个备用方案。

例如,这可能看起来像这样

<?php

include $_composer_autoload_path ?? __DIR__ . '/../vendor/autoload.php';

但是,如果您想在您的包中依赖它,您应该确保也要求 "composer-runtime-api": "^2.2",以确保包与支持该功能的 Composer 版本一起安装。

从二进制文件中查找 Composer bin-dir#

从 Composer 2.2.2 开始,bin 代理文件定义了一个新的 $_composer_bin_dir 全局变量,以便当您的二进制文件执行时,它可以轻松地使用它来定位项目的 Composer bin 目录。

对于非 PHP 二进制文件,从 Composer 2.2.6 开始,bin 代理设置了一个 COMPOSER_RUNTIME_BIN_DIR 环境变量。

但是,当运行由根包本身定义的二进制文件时,此全局变量将不可用,因此您需要有一个备用方案。

例如,这可能看起来像这样

<?php

$binDir = $_composer_bin_dir ?? __DIR__ . '/../vendor/bin';
#!/bin/bash

if [[ -z "$COMPOSER_RUNTIME_BIN_DIR" ]]; then
  BIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
else
  BIN_DIR="$COMPOSER_RUNTIME_BIN_DIR"
fi

但是,如果您想在您的包中依赖它,您应该确保也要求 "composer-runtime-api": "^2.2.2",以确保包与支持该功能的 Composer 版本一起安装。

Windows 和 .bat 文件呢?#

完全由 Composer 管理的包不需要包含任何 .bat 文件以实现 Windows 兼容性。Composer 在 Windows 环境中运行时以特殊方式处理二进制文件的安装。

  • 会自动生成一个 .bat 文件来引用二进制文件
  • 还会生成一个与二进制文件同名的 Unix 风格代理文件,这对于 WSL、Linux 虚拟机等很有用。

需要支持可能不包含 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 设置为 ./ 以将二进制文件放在您的项目根目录中。

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