Composer不自动加载通过存储库包含的文件>类型>路径

时间:2016-08-11 09:56:07

标签: php namespaces composer-php autoload

问题

我有两个PSR-4作曲家项目,我希望从另一个中分类,文件结构如下:

projectfoo
-public
--index.php
-src
--CompanyName
---Foo
----Foo.php
-composer.json
projectbar
-src
--CompanyName
---Bar
----Bar.php
-composer.json

composer.json文件是为projectfoo定义的(请注意存储库>类型>路径依赖项):

{
    "name": "companyname/foo",
    "require": {
        "companyname/bar": "*"
    },
    "repositories": [
        {
            "type": "path",
            "url": "../projectbar"
        }
    ],
    "autoload": {
        "psr-4": {
            "CompanyName\\": "src/CompanyName"
        }
    }
}

项目栏为:

{
    "name": "companyname/bar",
    "version": "1.0.0",
    "autoload": {
        "psr-4": {
            "CompanyName\\": "src/CompanyName"
        }
    }
}

正确运行composer update会生成包含companyname / foo文件夹的供应商文件夹。

在projectfoo的index.php我有:

require_once '../vendor/autoload.php';

$bar = new \CompanyName\Bar\Bar();

但是,当运行\CompanyName\Bar\Bar未定义时。

问题

为什么Bar没有包含在autoload.php文件中?

我尝试了什么

  • 使用以下方式刷新自动加载文件: composer install composer update composer dump-autoload
  • 将供应商名称CompanyName更改为其他名称。
  • 查看installed.json文件夹中的vendor\composer文件,该项目列为:

{
    "name": "companyname/bar",
    "version": "1.0.0",
    "version_normalized": "1.0.0.0",
    "dist": {
        "type": "path",
        "url": "../companyname/bar",
        "reference": "f35ed0ad82c8280db9b603712dd256074f99e196",
        "shasum": null
    },
    "type": "library",
    "installation-source": "dist",
    "autoload": {
        "psr-4": {
            "CompanyName\\": "src/CompanyName",
        }
    }
}
  • 奇怪的是,当引导autoload.php文件到phpunit时,文件会自动加载并在我的测试类中可用。

1 个答案:

答案 0 :(得分:1)

问题围绕作曲家链接的方式和#34;路径"使用符号链接的项目。

简而言之

因为我在Windows系统上开发并在Ubuntu流浪盒上执行代码,所以在Windows上设置的符号链接在运行composer install时解析为框内的破坏路径。这也解释了为什么在Windows上运行的测试设法找到Bar而不是在虚拟框中运行测试。

解决方案

为了解决这个问题,我最初强迫作曲家镜像项目而不是符号链接,但是,这仍然会导致供应商文件夹中的符号链接出现问题。

我现在已经开始在单独的存储库中托管我的库并使用"type": "vcs"标记导入它们。 Composer还会在新提交时处理更新包,而在使用"type": "path"标记进行镜像时不会发生这种情况。