【问题标题】:How can I install a single specific package from composer.json, to install developer tools?如何从 composer.json 安装单个特定包以安装开发人员工具?
【发布时间】:2021-11-05 07:25:33
【问题描述】:

我在我的 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 dev-dependency (require-dev)。

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

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

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

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

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

    【讨论】:

    • 下载标记版本时,我无法从版本范围中获利。不会自动安装版本 3.6.1 或 3.7.0。我必须密切关注版本并手动更新 URL。此外,如果我想要每个项目的特定版本的工具,我必须在每个项目目录中放置一个 phpcs.phar。通过 Composer 获取工具时,我可以安装不兼容的依赖项是什么意思?
    【解决方案2】:

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

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

    要解决这个问题,您可以使用 Composer Bin Plugin 之类的东西来隔离这些依赖项,然后通过 composer 安装它们。然后在 CI 上,您仅在此目录上运行 composer install,并从该位置运行该工具(或将其符号链接到 bin,这是插件在安装时所做的,但您不会将其安装在如果您仍然没有安装所有依赖项,请使用 CI)。

    【讨论】:

    • 谢谢,这行得通!但是,该解决方案会导致另一个问题。我已将"post-install-cmd": ["@composer bin all install --ansi"] 添加到我的 Composer 脚本中,因此在安装项目依赖项(用于开发)时会自动安装这些工具。但是在准备项目进行生产部署时该脚本会崩溃,因为composer install --no-dev 不会安装 Composer Bin 插件。
    • 正如我在回答中提到的,您不应该在 CI 期间使用该插件。由于您没有在 CI 上安装所有依赖项,因此您不能依赖插件。在 CI 中只需 cd 到相应的“bin”目录并在那里运行 composer install
    • 是的,但该插件是我项目的开发依赖项。但是,该问题与此 stackoverflow 问题无关。谢谢。
    • 你在开发时使用插件,但是一旦在 CI 上,你就不再使用插件了。在 CI 上,您将拥有(例如)vendor-bin/sometool。您只需cd vendor-bin/sometool && composer install,然后从那里运行该工具。例如php vendor-bin/csfixer/vendor/firendsofphp/php-cs-fixer
    • 我明白这一点。但是coding_standard作业成功后,会在项目构建的地方执行build作业(安装Composer和Node依赖,编译SASS和JS等)。我需要在那里运行composer install --no-dev,但是方便的post-install-cmd 脚本将会失败。
    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 2012-02-08
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多