【发布时间】:2015-08-19 22:24:01
【问题描述】:
我正在创建我的第一个作曲家包。我正在通过将其拉入 vanilla Laravel 项目来对其进行测试。
我遇到的问题是,当我在主 Laravel composer.json 文件中需要我的 composer 包,然后尝试更新自动加载时。
我的包的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
);
我在网上和 stackoverflow 上环顾四周,但我发现的各种答案和建议并没有解决问题。
谁能看到我错过了什么?
更新
根据 Alexandru Guzinschi 的回答,我尝试通过将以下块添加到我的 Laravel 项目的 composer.json 文件中来告诉我的 Laravel 项目有一个本地作曲家存储库要检查:
"repositories":[
{
"type": "vcs",
"url": "../cschmitz/L5SimpleFM"
}
],
然后,我将包文件夹从 cschmitz 目录移出到我的 laravel 项目的同一级别。文件结构现在如下所示:
LaravelProjectFolder/
composer.json
cschmitz/
L5SimpleFM/
composer.json
最初我遇到了错误“找不到处理 VCS 存储库供应商/cschmitz 的驱动程序”。读了一点后,我发现要能够使用这种本地存储库,repo 本身需要处于版本控制之下(即 git、svn 等)。说得通。我还没有将它置于版本控制之下,因为这只是一个用于尝试开发包的测试项目。
我在我的 Laravel 项目的根目录下创建了一个 git 存储库并运行 composer update。现在我得到了错误:
[Composer\Repository\InvalidRepositoryException] 在 ../cschmitz/L5SimpleFM 的任何分支或标签中找不到有效的 composer.json,无法从中加载包。
这很令人困惑,因为我可以ls ../cschmitz/L5SimpleFM/composer.json 并查看文件。我也可以运行git ls-tree -r master --name-only,查看本地仓库版本控制中的composer.json文件:
有什么东西会阻止我的 Laravel 项目看到本地存储库的 composer.json 文件吗?
【问题讨论】:
-
它还没有在 packagist 中,所以你需要告诉 Composer 在源代码管理中的哪里找到它,然后
composer install会找到并安装它 getcomposer.org/doc/… 但我希望作曲家报告执行composer install时找不到包的错误。 -
如果我已经手动将包移动到供应商文件夹中并且作曲家转储自动加载,那是否有必要?如果只是自动加载命名空间,我认为 composer 不需要 packagist。
-
不确定 - 我一直添加一个
repositories键来指向源代码库。我从未尝试将它们放入vendor/ -
这可能是因为您已经有一个锁定文件正在被
install命令读取。将存储库位置添加到您的 composer.json 中,然后运行 composer updateDocumentation explains the difference -
所以我删除了锁定文件,运行了 composer update,但它仍然没有将我的命名空间添加到自动加载文件中。我通读了文档,锁定文件听起来仍然像是处理下载包而不是生成自动加载文件。我再次阅读了关于自动加载的部分,听起来我所做的仍然有效。我仍然缺少一些东西。
标签: php composer-php autoload