基于Composer的Laravel扩展包开发工作流

时间:2022-04-15 04:58:36

使用场景

在引用第三方包的时候,对第三方包有改动需求,需要将代码放在自己的仓库;并且自己的其他项目也有需求引用自定义的第三方包;甚至自己会发布修改后的第三方包;

读完本文你讲获得:

  • Git Submodule的基本使用
  • 从本地加载第三方包
  • 从自定义仓库地址获取扩展包
  • 快速创建第三方包

本文是在我自己想要创建一个基础第三方包的时候记录下的操作步骤

1、利用git submoudle在已有项目中使用第三方包

通常利用composer安装的包均在vendor目录下,并且仓库地址均指向第三方包作者的仓库,而这时候修改第三方包,一是无法纳入git管理库,二是提交pull requests需要等待作者的审核更新,未必会采纳

1)Fork对方项目
2)下载fork后的项目到本地

```> mkdir packages
> git submodule add https://github.com/mpandar/laravel-packager.git packages/mpandar/laravel-packager
```

3)之后可以对该包内容进行编辑,并在packages/mpandar/laravel-packager目录使用git的命令,提交文件

2、调整composer.json内容,使项目能够使用自定义包内容

composer的包自动发现机制其实就是利用的psr-4(中文)


// autoload - psr-4 是项目主目录src
// autoload - files 主要就是加载helper函数
// autoload-dev - psr-4 主要是test
"autoload": {
"psr-4": {
"JeroenG\\Packager\\": "packages/mpandar/laravel-packager/src"
},
"files": [
"packages/mpandar/wechat/src/Kernel/Helpers.php"
]
},
"autoload-dev": {
"psr-4": {
"JeroenG\\Packager\\Tests\\": "packages/mpandar/laravel-packager/tests"
}
},

添加完成后要运行 composer dumpautoload,否则下面添加ServiceProvider会报错,找不到对应ServiceProvider

3、添加包的ServiceProvider

由于laravel的 package:discover 是读取 vendor/composer/installed.json 这个文件中安装的包,而我们的包是手动添加,所以无法自动添加ServiceProvider,手动在app.php中添加


'providers' => [
JeroenG\Packager\PackagerServiceProvider::class,
],
'aliases' => [
'CreditsShop' => Mpandar\CreditsShop\Facades\CreditsShop::class,
],

通过 php artist list 可以看到该包中的命令已经被添加

4、其他项目使用自定义包

JeroenG\Packager是用来快速创建基于laravel的扩展包,使用过程中,发现一点小的问题,比如 php artisan packager:new mpandar laravel-cart理想的目录结构应该是


packages
|-mpandar
|-laravel-cart
|-src
|-LaravelCartProvider.php
|-LaravelCart.php
|-Facades
|-LaravelCart.php

但其实际创建的Provider却命名为laravel-cartProvider,如果使用php artisan packager:new mpandar LaravelCart,目录名称又会错,所以我修复了这个问题(也可能是我不会用...)


// dev-master 表示取master分支
"repositories": [
{
"type": "vcs",
"url": "https://github.com/mpandar/laravel-packager"
}
],
"require": {
"jeroen-g/laravel-packager": "dev-master"
},
// composer update 即可

5、为Laravel开发扩展包

利用jeroen-g/laravel-packager很容易创建一个扩展包基础项目

```> php artisan packager:new mpandar credits-shop
0/6 [>---------------------------] 0% Creating package mpandar\credits-shop...
1/6 [====>-----------------------] 16% Creating packages directory...
2/6 [=========>------------------] 33% Creating vendor...
3/6 [==============>-------------] 50% Downloading skeleton...
4/6 [==================>---------] 66% Replacing skeleton placeholders...
5/6 [=======================>----] 83% Dumping autoloads and discovering package...
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
6/6 [============================] 100% Package created successfully!
```

其创建的目录结构:

基于Composer的Laravel扩展包开发工作流

并在composer.json以及app.php中自动添加了相关配置。
ok,接下来就可以进行扩展包的开发了!

原文地址:https://segmentfault.com/a/1190000016069204