当前位置: 首页 > 后端技术 > PHP

Composer&Laravel打包本地开发

时间:2023-03-29 15:33:25 PHP

本文参考了超哥写的基于Composer的PHP模块化开发详细实践版。开发痛点相信很多人都不知道composer。他们在开发包的时候会这样:创建项目(jcc/new-package)->写业务逻辑->推送到代码仓库->创建调试项目->安装包(composerrequirejcc/new-package-vvv)->debug->modifyproject->pushupdatecode->debugproject(composerupdate-vvv)->updatepackagecodeindebugproject(composerupdate-vvv)->...可以看出重复提交和更新是很麻烦的代码,无法实时调试。本文主要解决的问题:在本地开发包时,可以在本地进行测试,无需将代码提交到第三方代码仓库,然后在项目中安装composerrequire进行测试:创建项目(jcc/new-package)->编写业务逻辑->创建调试项目->配置composer.json->调试->修改项目->直接在调试项目中调试->...可见本地开发可以减少git提交和拉取代码的时间,并减少每次提交的成本尽可能低级错误的版本。本地包开发的工作原理:Composer将本地开发的包从新项目(jcc/taxi)软连接到调试项目(jcc/test-taxi/vendor/jcc/texi),主要是利用repositories的路径类型,更新信息请移步文档Composerpackagelocaldevelopment首先我们来看一下Composer安装包的结构。正常使用时,以安装好的laravel/laravel)为例,打开vendor目录下的laravel,会看到如下结构:vendor/laravel├──framework│└──src│└──Illuminate│└──...└──tinker└──src└──Console再看看Laravel项目下的composer.json文件require或require-dev的依赖包:{...,"require":{"php":">=7.0.0","fideloper/proxy":"~3.3","laravel/framework":"5.5.*","laravel/tinker":"~1.0"},...}从此,我们可以知道目录结构是对应的。创建目录并初始化当然,在初始化和创建目录的时候,要注意项目名称和目录结构保持一致。比如我的新项目叫jcc/taxi,那么我创建的目录结构应该是这样的:jcc└──taxi那么我们需要在taxi中创建一个目录进来进行进一步的开发。当然,开发前需要初始化composer配置。在taxi目录下运行:composerinit并根据提示填写信息:texi目录下会多出一个composer.json文件:{"name":"jcc/taxi","description":"This是一个测试。","type":"library","license":"MIT","authors":[{"name":"jcc","email":"changejian@gmail.com"}],"minimum-stability":"dev","require":{}}创建开发目录并设置必要的信息一般我们会创建2个目录,一个是给src用来存放包的所有逻辑代码,一个是tests存放测试用例:jcc/taxi├──src├──tests├──README.md├──composer.json└──LICENSE需要注意的是,我们需要在composer中设置composer自动加载配置。在composer.json中加入:{...,"autoload":{"psr-4":{"Jcc\\Taxi\\":"src/"}},"autoload-dev":{"psr-4":{"Jcc\\Taxi\\Tests\\":"tests/"}},...}更多内容请参考Composerautoload文档创建测试包Project首先在jcc目录下新建工程进行测试:jcc├──taxi└──test-taxi然后初始化composer配置,生成composer.json文件:composerinit然后添加Repositories项目,有两种方式:第一种:直接运行命令composerconfigrepositories.jccpath/Users/jiajianchan/Sites/jcc/taxi第二种:直接在composer中.json文件添加:{...,"repositories":{"jcc":{"type":"path","url":"/Users/jiajianchan/Sites/jcc/taxi"}}}type为路径,url是项目的相对路径。下一步是添加依赖项。也有两种方式:shell:composerrequirejcc/taxi:dev-master-vvv在composer.json中加入:{...,"require":{"jcc/taxi":"dev-master"},...}当然要注意版本号,一定要在jcc/taxi项目的composer.json中设置minimum-stability属性,否则安装包错误版本号会报找不到开发测试首先在jcc/taxi项目下的src中创建Client.php文件:a=$a;$this->b=$b;}publicfunctionaddTogether(){return$this->a+$this->b;}}安装在jcc/test-taxi目录下jcc/taxi项目后,添加test.php文件://Importcomposerautoloadfilerequire__DIR__。'/vendor/autoload.php'$client=newJcc\Taxi\Client(5,1);echo$client->addTogether()。"\n";最后运行jcc/test-taxi目录下的test.php文件,得到添加的结果:phptest.php如果细心,会发现jcc/test-taxi下的jcc/taxi依赖项目出租车的供应商目录是一个软链接。也就是说,你可以在jcc/taxi中的Client.php文件中添加一个新的方法,然后在jcc/test-taxi项目中调用,无需重新composer更新包。很方便。Laravel包的本地开发Laravel包的本地开发与Composer包开发基本相同,下面简单介绍一下。首先新建一个Laravel项目:composercreate-projectlaravel/laravellaravel-vvv在Laravel项目中创建如下目录:laravel├──app├──...└──packages└──jcc└──taxi├──LICENSE├──README.md├──composer.json├──src│├──Taxi.php│└──TaxiServiceProvider.php└──testsjcc/taxi(vendor/name)是我们想要的Laravel发布包,jcc对应github用户名,taxi对应项目名。先初始化composer配置,和正常包开发没什么区别,然后在jcc/taxi下的src目录下创建TaxiServiceProvider.php文件:{publicfunctionboot(){//}publicfunctionregister(){$this->app->singleton('taxi',function(){returnnewTaxi;});}}创建Taxi.php文件:[...,Jcc\Taxi\TaxiServiceProvider::Class,],];修改laravel项目下的composer.json文件:{...,"autoload":{...,"psr-4":{...,"Jcc\\Taxi\\":"packages/jcc/taxi/src/"}},...}然后运行命令:composerdump-autoload最后在web.php中修改:Route::get('/',function(){app('taxi')->printRunning();});此时,我们访问laravel当项目首页显示running字样时,恭喜。开发一个包成功不难,但说起来不容易。最重要的是你需要源源不断的创意!