Composer 不自动加载通过存储库 > 类型 > 路径包含的文件
Composer not autoloading files included through repositories > type > path
问题
我有两个 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
更改为其他名称。
- 查看
vendor\composer
文件夹中的 installed.json
文件,bar 项目列为:
#
{
"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 时,文件会正确自动加载并且在我的测试中可用 类。
问题围绕作曲家使用符号链接链接“路径”项目的方式。
简而言之
因为我在 windows 系统上开发并在 Ubuntu vagrant box 上执行代码,符号链接在 windows 上设置,当 运行ning composer install
正在解决盒子内的破损路径。这也解释了为什么 windows 上的测试 运行 设法找到 Bar
而不是虚拟框中的测试 运行。
解决方案
为了解决这个问题,我最初强制作曲家镜像项目而不是符号链接,但是,这仍然导致供应商文件夹中的符号链接出现问题。
我现在开始在单独的存储库中托管我的库,并使用运行良好的 "type": "vcs"
标签导入它们。 Composer 还会在进行新提交时处理更新包,这在使用带镜像的 "type": "path"
标记时不会发生。
问题
我有两个 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
更改为其他名称。 - 查看
vendor\composer
文件夹中的installed.json
文件,bar 项目列为:
#
{
"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 时,文件会正确自动加载并且在我的测试中可用 类。
问题围绕作曲家使用符号链接链接“路径”项目的方式。
简而言之
因为我在 windows 系统上开发并在 Ubuntu vagrant box 上执行代码,符号链接在 windows 上设置,当 运行ning composer install
正在解决盒子内的破损路径。这也解释了为什么 windows 上的测试 运行 设法找到 Bar
而不是虚拟框中的测试 运行。
解决方案
为了解决这个问题,我最初强制作曲家镜像项目而不是符号链接,但是,这仍然导致供应商文件夹中的符号链接出现问题。
我现在开始在单独的存储库中托管我的库,并使用运行良好的 "type": "vcs"
标签导入它们。 Composer 还会在进行新提交时处理更新包,这在使用带镜像的 "type": "path"
标记时不会发生。