我使用Laravel 5.2编写了一个具有多模块/包功能的系统。所有模块都将位于名为modules
的文件夹中。
为了开始,我写了一个小程序包,它位于一个名为modules/Mikea/Surveys
的文件夹中。文件夹Mikea
是供应商名称,Surveys
是模块/包名称。每个包都必须有自己的composer.json
文件,该文件允许开发人员使用自己的composer配置来配置每个包。
这里的想法是有一个支持扩展的Laravel安装,允许任何开发者为我的主要"系统"做出贡献
以下是我的modules
文件夹看起来像的样子
modules
modules/Mikea
modules/Mikea/Surveys
modules/Mikea/Surveys/database
modules/Mikea/Surveys/resources
modules/Mikea/Surveys/composer.json
modules/Mikea/Surveys/routes.php
modules/Mikea/Surveys/src
modules/Mikea/Surveys/src/Controllers
modules/Mikea/Surveys/src/Jobs
modules/Mikea/Surveys/src/Models
modules/Mikea/Surveys/src/....
在我的主composer.json
文件中,我在存储库部分使用"路径"类型,如您在下面的composer.json文件中看到的那样
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.2.*",
"laravelcollective/html": "5.2.x-dev",
"mikea/surveys": "*"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1",
"symfony/dom-crawler": "~3.0",
"symfony/css-selector": " ~3.0"
},
"repositories": [
{
"type": "path",
"url": "modules/mikea/Surveys"
}
],
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"pre-update-cmd": [
"php artisan clear-compiled"
],
"post-update-cmd": [
"php artisan optimize"
],
"post-root-package-install": [
"php -r "copy('.env.example', '.env');""
],
"post-create-project-cmd": [
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
}
}
在modules/Mikea/Surveys
中,我有另一个composer.json
文件,它允许我分别配置每个包,如包版本、许可证、作者。。。。
这是我的第二个composer.json文件"composer.json for my extension"的副本
{
"name": "mikea/surveys",
"type": "library",
"version": "0.1.4",
"description": "Survey System",
"keywords": ["Mike A", "Surveys"],
"license": "MIT",
"authors": [
{
"name": "Mike A",
"email": "mikea@example.com"
}
],
"require": {
"php": ">=5.4.0"
},
"autoload": {
"classmap": [
"database/migrations",
"database/seeds"
],
"psr-4": {
"mikea\Surveys\": "src/"
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
现在一切都很好。我所要做的就是从命令行执行composer update
。它只需将文件从modulesMikeaSurveys
复制到vendormikeaSurveys
然后我可以使用命令行发布我的视图。
我面临的问题是,每次我对modules/Mikea/Surveys
中的文件进行更改时,我都必须执行以下两个丑陋的步骤才能在浏览器中看到我的工作。
- 在我的第二个
composer.json
文件中,我必须增加模块的版本号的值"基本上是欺骗作曲家认为有一个新版本的包" - 运行
composer update
将文件从modulesMikeaSurveys
重新复制到vendormikeaSurveys
这显然是太多的工作,没有人想这样做!
当我处于开发模式时,我该如何告诉composer从modules/Mikea/Surveys
自动加载文件?因此,我会继续在modulesMikeaSurveys
文件夹中进行更改/更新,直到我准备好发布新版本的软件包为止。准备好后,我将创建一个新版本并运行composer update
以获得最新的可用版本。
我对如何发展这样一个系统持开放态度。
您需要在主composer.json文件中为pst-4对象中的所有模块添加名称空间,与您为mikea\survements所做的操作相同。
在bootstrap/autoload.php中,将require绑定到一个变量,如下所示:
$autoload = require __DIR__.'/../vendor/autoload.php';
然后:
$autoload->addPsr4($namespace, $path);
这将在composer自动加载器中注册您的命名空间,而无需向您的composer.json添加任何内容。您还可以在composer.json旁边创建第二个json,该json将自动加载命名空间,并在您的laravel应用程序中创建一个服务提供程序,该服务提供程序将自动加载启用包的服务提供程序。