问题
我有两个PSR-4 composer项目,我希望从一个到另一个,文件结构如下:
projectfoo
-public
--index.php
-src
--CompanyName
---Foo
----Foo.php
-composer.json
projectbar
-src
--CompanyName
---Bar
----Bar.php
-composer.json
作曲家。Json文件为projectfoo定义为(注意存储库>类型>路径依赖):
{
"name": "companyname/foo",
"require": {
"companyname/bar": "*"
},
"repositories": [
{
"type": "path",
"url": "../projectbar"
}
],
"autoload": {
"psr-4": {
"CompanyName\": "src/CompanyName"
}
}
}
和projectbar为:
{
"name": "companyname/bar",
"version": "1.0.0",
"autoload": {
"psr-4": {
"CompanyName\": "src/CompanyName"
}
}
}
正确运行composer update
会生成包含companyname/foo文件夹的vendor文件夹。
在index.php
在项目foo我有:
require_once '../vendor/autoload.php';
$bar = new CompanyNameBarBar();
但是,当运行CompanyNameBarBar
时,没有定义。
<标题>
为什么Bar
不被包含在autoload.php文件?
我已经试过了
- 使用以下命令刷新自动加载文件:
composer install
composer update
composer dump-autoload
- 将供应商名称
CompanyName
更改为其他名称 查看
vendorcomposer
文件夹中的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",
}
}
}
- 奇怪的是,当引导autolload .php文件到phpunit时,这些文件会自动正确加载,并且在我的测试类中可用。
问题围绕着编写者链接"路径"的方式展开使用符号链接的项目。
<标题>
因为我是在windows系统上开发的,并在Ubuntu流浪盒上执行代码,所以在windows上设置的符号链接在运行composer install
时被解析为盒子内的破碎路径。这也解释了为什么在windows上运行的测试能够找到Bar
,而在虚拟机中运行的测试却无法找到。
<标题> 解决方案
为了解决这个问题,我最初强迫composer镜像项目而不是符号链接它,然而,这仍然导致了供应商文件夹中的符号链接问题。
我现在已经开始在单独的存储库中托管我的库,并使用"type": "vcs"
标签导入它们,这很好地工作。当有新的提交时,Composer也会处理更新包,这在使用带有镜像的"type": "path"
标签时不会发生。