如何安装 composer.json 中的单个特定包以安装开发人员工具?

How can I install a single specific package from composer.json, to install developer tools?

我在我的 GitLab CI/CD 管道中使用 PHP_CodeSniffer 来确保我的代码格式正确。作业如下所示:

stages:
  - test
  - build
  - deploy

coding_standard:
  stage: test
  script:
    - curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
    - php phpcs.phar --extensions=php .

这按预期工作。但是,此处未指定该工具的确切版本。因此,如果突然出现 PHP_Codesniffer 的新主要版本,CI/CD 作业可能会失败,尽管我的 PHP 代码没有更改。
此外,我目前在我的本地机器上全局安装了该工具。这样,我就无法为每个 PHP 项目提供特定版本的工具。

现在我想将该工具添加为 Composer 开发依赖项 (require-dev)。

在 CI/CD 作业中,我会调用 composer install 而不是通过 curl 下载该工具。

问题:这将不必要地下载 所有 包,而不仅仅是 PHP_Codesniffer 及其依赖项。我可以阻止吗?

为什么不从 Github 到 https://github.com/squizlabs/PHP_CodeSniffer/releases, like https://github.com/squizlabs/PHP_CodeSniffer/releases/download/3.6.0/phpcs.phar 下载任何标记版本?

使用 PHAR 比使用 Composer 安装此类东西要好,因为您可能会以这种方式安装其他不兼容的依赖项(phpcs 不是这种情况,但 phpmd 等其他工具会从 Symfony 安装其他依赖项)

你不能用作曲家做到这一点。您甚至不能安装“仅开发依赖项”。这就是所有的依赖项,所有的非开发依赖项,仅此而已。

并且将这种依赖项安装为项目通常不是一个好主意,因为您可以很容易地输入dependency hell 出于超出您实际应用需求的原因。开发工具不应给您的部署策略带来那种程度的复杂性和危险。

为了解决这个问题,您可以使用 Composer Bin Plugin 之类的东西来隔离这些依赖项,然后通过 composer 安装它们。然后在 CI 上,你只在这个目录上 运行 composer install,运行 这个位置的工具(或者符号链接到 bin,这就是该插件在安装时会执行,但如果您不安装所有依赖项,则不会在 CI 中安装它。