问题
我有两个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文件夹的vendor文件夹 .
在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
更改为其他名称 . -
查看
vendor\composer
文件夹中的installed.json
文件,栏项目列为:
#
{
"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 回答
问题围绕着作曲家使用符号链接链接“路径”项目的方式 .
简而言之
因为我在Windows系统上开发并在Ubuntu vagrant box上执行代码,所以在Windows上设置符号链接,当运行
composer install
时解析为框内的破坏路径 . 这也解释了为什么在Windows上运行的测试设法找到Bar
而不是在虚拟框中运行的测试 .解决方案
为了解决这个问题,我最初强迫composer镜像项目而不是符号链接,但是,这仍然导致了vendor文件夹中的符号链接问题 .
我现在开始在单独的存储库中托管我的库并使用
"type": "vcs"
标签导入它们,这很好用 . 在进行新提交时,Composer还会处理更新包,而在使用"type": "path"
标记和镜像时不会发生这种情况 .