PHP class 未找到错误仅发生在 CircleCI 上
PHP class not found error ONLY happens on CircleCI
当我 运行 或在本地测试我的代码时,我没有看到任何错误。我的 phpunit
测试套件通过:
Time: 11.69 seconds, Memory: 43.50Mb
OK, but incomplete, skipped, or risky tests!
Tests: 149, Assertions: 281, Incomplete: 13.
但是当我推送完全相同的代码和 CircleCI 运行s 完全相同的测试命令时,它失败并出现致命错误:
.PHP Fatal error: Class 'App\Domain\API\Request\Soap\Json\AbstractJson' not found in /home/ubuntu/TransitScreen/src/Domain/Api/Request/Soap/Json/NJTransit.php on line 10 php ./vendor/bin/phpunit --no-coverage --testsuite=unit returned exit code 255
这是我的 circle.yml:
test:
override:
- php ./vendor/bin/phpunit --no-coverage --testsuite=unit
machine:
php:
version: 5.6.5
environment:
APP_ENV: circleci
它引用的文件开头为:
<?php
namespace App\Domain\API\Request\Soap\Json;
use App\Domain\Api\Request\InputApiDataRequest;
use App\Domain\Api\Request\Soap\AsyncSoapClient;
use Assert\Assertion;
class NJTransit extends AbstractJson
{
起初我以为 CircleCi 可能是 运行 宁旧版本的 PHP 没有命名空间或其他东西但即使我将它设置为使用 PHP v5.6.5 同样的错误发生。我什至尝试将数据库转储添加到测试序列中。
更让我感到奇怪的是,它能够在错误发生之前运行 进行几十次测试。所以我很确定这不是 CircleCI 上严重配置错误的东西。
对于为什么相同的代码在两种环境中表现如此不同,有什么建议吗?
更新 1: 我发现这个问题听起来非常相似,但到目前为止覆盖 composer 命令还没有解决问题。
Laravel - CircleCI - Fails on phpunit
更新 2: 我发现 this question 谈到自动加载不起作用......它提出了一个新理论......也许存在涉及区分大小写的问题OSX(我的本地环境)和 Ubuntu(CircleCI)之间的差异。这是我的 composer.json
文件的相关部分:
"autoload": {
"psr-4": {
"App\": "src"
}
},
"autoload-dev": {
"psr-4": {
"App\Test\": "tests",
"Cake\Test\": "./vendor/cakephp/cakephp/tests",
"TestApp\": "tests/TestApp/src",
"TestApp\Test\": "tests/TestApp/tests"
}
},
即使使用您提供的代码示例,我也花了一些时间才发现它,但看起来命名空间的一部分是错误的大小写(API
与 Api
)?
与流行的看法相反,OS X 机器默认格式化为不区分大小写,不幸的是,这使它们在这方面更像 Windows 机器。
当我 运行 或在本地测试我的代码时,我没有看到任何错误。我的 phpunit
测试套件通过:
Time: 11.69 seconds, Memory: 43.50Mb
OK, but incomplete, skipped, or risky tests!
Tests: 149, Assertions: 281, Incomplete: 13.
但是当我推送完全相同的代码和 CircleCI 运行s 完全相同的测试命令时,它失败并出现致命错误:
.PHP Fatal error: Class 'App\Domain\API\Request\Soap\Json\AbstractJson' not found in /home/ubuntu/TransitScreen/src/Domain/Api/Request/Soap/Json/NJTransit.php on line 10 php ./vendor/bin/phpunit --no-coverage --testsuite=unit returned exit code 255
这是我的 circle.yml:
test:
override:
- php ./vendor/bin/phpunit --no-coverage --testsuite=unit
machine:
php:
version: 5.6.5
environment:
APP_ENV: circleci
它引用的文件开头为:
<?php
namespace App\Domain\API\Request\Soap\Json;
use App\Domain\Api\Request\InputApiDataRequest;
use App\Domain\Api\Request\Soap\AsyncSoapClient;
use Assert\Assertion;
class NJTransit extends AbstractJson
{
起初我以为 CircleCi 可能是 运行 宁旧版本的 PHP 没有命名空间或其他东西但即使我将它设置为使用 PHP v5.6.5 同样的错误发生。我什至尝试将数据库转储添加到测试序列中。
更让我感到奇怪的是,它能够在错误发生之前运行 进行几十次测试。所以我很确定这不是 CircleCI 上严重配置错误的东西。
对于为什么相同的代码在两种环境中表现如此不同,有什么建议吗?
更新 1: 我发现这个问题听起来非常相似,但到目前为止覆盖 composer 命令还没有解决问题。 Laravel - CircleCI - Fails on phpunit
更新 2: 我发现 this question 谈到自动加载不起作用......它提出了一个新理论......也许存在涉及区分大小写的问题OSX(我的本地环境)和 Ubuntu(CircleCI)之间的差异。这是我的 composer.json
文件的相关部分:
"autoload": {
"psr-4": {
"App\": "src"
}
},
"autoload-dev": {
"psr-4": {
"App\Test\": "tests",
"Cake\Test\": "./vendor/cakephp/cakephp/tests",
"TestApp\": "tests/TestApp/src",
"TestApp\Test\": "tests/TestApp/tests"
}
},
即使使用您提供的代码示例,我也花了一些时间才发现它,但看起来命名空间的一部分是错误的大小写(API
与 Api
)?
与流行的看法相反,OS X 机器默认格式化为不区分大小写,不幸的是,这使它们在这方面更像 Windows 机器。