autoload_psr4 文件中没有显示我的 composer 包的命名空间
My composer package's namespace doesn't show in the autoload_psr4 file
我正在创建我的第一个作曲家包。我正在通过将其拉入普通 Laravel 项目来对其进行测试。
我遇到的问题是,当我在主 Laravel composer.json 文件中需要我的作曲家包,然后尝试更新自动加载。
我的包裹composer.json:
{
"name": "cschmitz/l5-simplefm",
"description": "A Laravel 5 wrapper for Soliant Consulting's SimpleFM package.",
"require": {
"soliantconsulting/simplefm": "3.0.*"
},
"license": "MIT",
"authors": [
{
"name": "cschmitz",
"email": "schmitz.chris@gmail.com"
}
],
"minimum-stability": "dev",
"autoload": {
"psr-4": {
"L5SimpleFM\": "src/"
}
}
}
我的包在 Laravel 项目的 vendor
文件夹中的文件夹结构:
我的 Laravel 项目的 composer.json:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.1.*",
"cschmitz/l5-simplefm": "dev" // Requiring my package here
},
...
在此之后,我进行了composer dump-autoload
。我没有从作曲家那里得到任何错误,但是当我检查我的 vendor/composer/autoload_psr4.php
文件时,我的命名空间没有列在数组中:
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
...
'App\' => array($baseDir . '/app'),
// I expected to see `'L5SimpleFM\' => array($vendorDir . '/cschmitz/L5SimpleFM/src')` as the last key of this array, but nothing shows past the App key
);
我在网上和Whosebug上看了看,但我找到的各种答案和建议都没有解决问题。
谁能看到我遗漏了什么?
更新
根据 Alexandru Guzinschi 的回答,我尝试通过将以下块添加到我的 Laravel 项目的 composer.json 文件中来告诉我的 Laravel 项目有一个要检查的本地作曲家存储库:
"repositories":[
{
"type": "vcs",
"url": "../cschmitz/L5SimpleFM"
}
],
然后我将从 cschmitz
目录开始的包文件夹移到与我的 laravel 项目相同的级别。文件结构现在如下所示:
LaravelProjectFolder/
composer.json
cschmitz/
L5SimpleFM/
composer.json
最初我运行进入错误"No driver found to handle VCS repository vendor/cschmitz"。阅读了一下后,我发现要能够使用这种本地存储库,存储库本身需要处于版本控制之下(即 git、svn 等)。说得通。我还没有将它置于版本控制之下,因为这只是一个用于尝试开发包的测试项目。
我在 Laravel 项目和 运行 composer update
的根目录下创建了一个 git 存储库。现在我收到错误:
[Composer\Repository\InvalidRepositoryException]
No valid composer.json was found in any branch or tag of ../cschmitz/L5SimpleFM, could not load a package from it.
这令人困惑,因为我可以 ls ../cschmitz/L5SimpleFM/composer.json
并查看该文件。我还可以 运行 git ls-tree -r master --name-only
并在本地存储库版本控制中查看 composer.json 文件:
有什么东西会阻止我的 Laravel 项目看到本地存储库的 composer.json 文件吗?
将您的库移动到 vendor
目录中是不够的,因为 Composer 不会扫描该目录并且不知道您的更改。
您需要通过将您的包发布到 Packagist 或从本地文件系统加载它来告诉 Composer 您的包。在您的 Laravel 项目 composer.json 文件中,更改:
"repositories": [
{
"type": "vcs",
"url": "/path/to/cschmitz"
}
],
"require": {
"cschmitz/l5-simplefm": "dev-develop"
}
接下来您需要 运行 composer update
以便安装您的库。
与您当前的问题无关,但很快就会成为一个问题:
执行此操作并继续处理 cschmitz/l5-simplefm
库后,您会注意到需要提交对库所做的更改,然后 运行 composer update
在您可以使用这些更改之前再次在您的 Laravel 项目中。关于如何规避此问题,您有一些解决方案 here。
我正在创建我的第一个作曲家包。我正在通过将其拉入普通 Laravel 项目来对其进行测试。
我遇到的问题是,当我在主 Laravel composer.json 文件中需要我的作曲家包,然后尝试更新自动加载。
我的包裹composer.json:
{
"name": "cschmitz/l5-simplefm",
"description": "A Laravel 5 wrapper for Soliant Consulting's SimpleFM package.",
"require": {
"soliantconsulting/simplefm": "3.0.*"
},
"license": "MIT",
"authors": [
{
"name": "cschmitz",
"email": "schmitz.chris@gmail.com"
}
],
"minimum-stability": "dev",
"autoload": {
"psr-4": {
"L5SimpleFM\": "src/"
}
}
}
我的包在 Laravel 项目的 vendor
文件夹中的文件夹结构:
我的 Laravel 项目的 composer.json:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.1.*",
"cschmitz/l5-simplefm": "dev" // Requiring my package here
},
...
在此之后,我进行了composer dump-autoload
。我没有从作曲家那里得到任何错误,但是当我检查我的 vendor/composer/autoload_psr4.php
文件时,我的命名空间没有列在数组中:
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
...
'App\' => array($baseDir . '/app'),
// I expected to see `'L5SimpleFM\' => array($vendorDir . '/cschmitz/L5SimpleFM/src')` as the last key of this array, but nothing shows past the App key
);
我在网上和Whosebug上看了看,但我找到的各种答案和建议都没有解决问题。
谁能看到我遗漏了什么?
更新
根据 Alexandru Guzinschi 的回答,我尝试通过将以下块添加到我的 Laravel 项目的 composer.json 文件中来告诉我的 Laravel 项目有一个要检查的本地作曲家存储库:
"repositories":[
{
"type": "vcs",
"url": "../cschmitz/L5SimpleFM"
}
],
然后我将从 cschmitz
目录开始的包文件夹移到与我的 laravel 项目相同的级别。文件结构现在如下所示:
LaravelProjectFolder/
composer.json
cschmitz/
L5SimpleFM/
composer.json
最初我运行进入错误"No driver found to handle VCS repository vendor/cschmitz"。阅读了一下后,我发现要能够使用这种本地存储库,存储库本身需要处于版本控制之下(即 git、svn 等)。说得通。我还没有将它置于版本控制之下,因为这只是一个用于尝试开发包的测试项目。
我在 Laravel 项目和 运行 composer update
的根目录下创建了一个 git 存储库。现在我收到错误:
[Composer\Repository\InvalidRepositoryException] No valid composer.json was found in any branch or tag of ../cschmitz/L5SimpleFM, could not load a package from it.
这令人困惑,因为我可以 ls ../cschmitz/L5SimpleFM/composer.json
并查看该文件。我还可以 运行 git ls-tree -r master --name-only
并在本地存储库版本控制中查看 composer.json 文件:
有什么东西会阻止我的 Laravel 项目看到本地存储库的 composer.json 文件吗?
将您的库移动到 vendor
目录中是不够的,因为 Composer 不会扫描该目录并且不知道您的更改。
您需要通过将您的包发布到 Packagist 或从本地文件系统加载它来告诉 Composer 您的包。在您的 Laravel 项目 composer.json 文件中,更改:
"repositories": [
{
"type": "vcs",
"url": "/path/to/cschmitz"
}
],
"require": {
"cschmitz/l5-simplefm": "dev-develop"
}
接下来您需要 运行 composer update
以便安装您的库。
与您当前的问题无关,但很快就会成为一个问题:
执行此操作并继续处理 cschmitz/l5-simplefm
库后,您会注意到需要提交对库所做的更改,然后 运行 composer update
在您可以使用这些更改之前再次在您的 Laravel 项目中。关于如何规避此问题,您有一些解决方案 here。