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"
    }
},

即使使用您提供的代码示例,我也花了一些时间才发现它,但看起来命名空间的一部分是错误的大小写(APIApi)?

与流行的看法相反,OS X 机器默认格式化为不区分大小写,不幸的是,这使它们在这方面更像 Windows 机器。