设置 PHP 单元 - PHP CLI 未执行 shell 脚本

Setting up PHPunit - PHP CLI is not executing the shell script

我参加了一个多开发者计划。另一个开发人员通过 composer 安装了 PHPUnit 并成功地进行了 运行ning 测试。我使用了作曲家文件 运行 composer update,但是当我尝试 运行 测试时,我收到此错误:

C:\Repos\Project\TDD>php vendor/bin/phpunit

输出:

dir=$(cd "${0%[/\]*}" > /dev/null; cd "../phpunit/phpunit" && pwd)

if [ -d /proc/cygdrive ]; then
    case $(which php) in
        $(readlink -n /proc/cygdrive)/*)
            # We are in Cygwin using Windows php, so the path must be translated
            dir=$(cygpath -m "$dir");
            ;;
    esac
fi

"${dir}/phpunit" "$@"

这是php单元shell脚本的内容。 shebang 第一行 #!/usr/bin/env sh 没有输出,但这是文件的其余部分。问题似乎是 PHP CLI 没有执行脚本,只是读取它。我不知道如何解决这个问题。

我在 windows 环境中,我没有在本地 运行ning apache。

我尝试过的事情:

  "config": {
    "platform": {
      "php": "7.4.20"
    }
  }

编辑:有趣的是,我将它全部上传到我的 LAMP 网络服务器和 运行 相同的脚本,但它也没有在那里执行。它正在输出文件...

您在解决问题时会摆弄很多东西,因此只能对它进行扩展评论。对它持保留态度,选择对你有意义的部分,在我看来你很聪明,应该尽快接近连接点的点(不要放弃):


C:\Repos\Project\TDD>php vendor/bin/phpunit

在你的 windows shell 提示符下命令 php 二进制文件执行 (php) 脚本 vendor/bin/phpunit.

而 PHP 正是这样做的(其他一切都会令人惊讶,对吧?),它执行该脚本。

您看到的输出证实了这一点。由于 php 是 PHP CLI SAPI(PHP 二进制命令行),以 # 开头的第一行是 not 输出(您也可以在 PHP 文档中找到此行为的描述:https://www.php.net/manual/en/features.commandline.usage.php and on antoher place that I can't find right now that exactly describes this difference to the common mode https://www.php.net/manual/en/language.basic-syntax.phpmode.php)。

然后你正确分析:

This is the content of the phpunit shell script.

并在 shebang 行做笔记:

#!/usr/bin/env sh

所以在我看来,这个 shell 脚本 vendor/bin/phpunit 而不是 来执行给定命令行:

php vendor/bin/phpunit

而是通过:

C:\Repos\Project\TDD>vendor/bin/phpunit

这不会(或者 可能 不会)在您的 windows 系统上工作。

一些更多的背景信息(这适用于 phpunit bin-stubs 以及其他作为 composer(1) 依赖项安装的):

  • composer 管理这些脚本(为您)
  • composer 为 POSIX 兼容系统以及其他系统处理它们(比较愚蠢的 /usr/bin/env sh,它是 /bin/sh,总是,可能需要关于 composer 项目的报告) 包括。 windows or windows with cygwin or WSL 运行ning on Windows, Vagrant box setups etc. pp.(是的,多年来他们真的很关心)。
  • composer 在 install/update 时处理此问题。
  • for windows(我无法比较没有使用它但我记得)作曲家正在添加 .bat.cmd 文件 next 到命令(因为这就是 Windows 处理可执行文件的方式)。

所以 mabye 使用:

C:\Repos\Project\TDD>composer exec phpunit

已经解决了你的调用问题。

C:\Repos\Project\TDD>vendor\bin\phpunit.bat

C:\Repos\Project\TDD>vendor\bin\phpunit.cmd

C:\Repos\Project\TDD>vendor\bin\phpunit

确实如此。以防万一:https://getcomposer.org/doc/articles/vendor-binaries.md


在我看来,总而言之,您从一位开发 unixoide 系统(Mac、Linux)的开发人员那里得到了指示,并且您 运行 正在 Windows.这不应该在那个层面上造成问题,但是你的团队中的入职率可能很低,或者它只是知识管理(不幸的是,在 Whosebug 十年或更长时间之后,这变得 更糟) 而你却独自解决了问题。

这不是编程问题,只是将工具安装到 运行。

也许有一些关于 composer 和 运行 的制度阻止你先看那里。但这在 Whosebug 上很难说。

我会重新开始该项目,将其从磁盘中删除并重新安装。这必须始终有效。为了不下沉当前项目,您可以在第二个目录中重新执行此操作(该项目可能支持 composer create-project 以使其快速启动 - 即克隆新的 composer install).

类似的是,您可以在现有项目中执行 composer update(旨在修改它,具体取决于您使用的项目与 composer 的集成程度以及您的开发平台将启用或破坏事物)。

归根结底,常见的工作流程是:

> rmdir vendor

(删除供应商目录,即空白)

> composer install

(安装vendor目录,即项目的所有PHP依赖项)

> composer exec phpunit

(执行php单元测试-运行ner)


Edit: Interestingly, I uploaded it all to my LAMP webserver and ran the same script there, and it is not executing there either. It's outputting the files...

切勿在网络服务器系统上安装 php单元。 运行 正在开发中或 CI,但不在网络服务器上。时期。 (这有安全隐患,它不会帮助你在那里执行它,你需要 运行 在你进行 TDD 时开发的地方 - 保持这个重点以进行故障排除)


vendor/bin/phpunit 表示的 PHP 脚本的真实路径是:

vendor/sebastianbergmann/phpunit/phpunit

(可以在php单元https://github.com/sebastianbergmann/phpunit/blob/master/composer.json#L66的composer.json中找到)

鉴于您的原始命令行和您提供的各种其他信息,这应该有效:

php vendor/sebastianbergmann/phpunit/phpunit