本文参考超哥写的 基于 Composer 的 PHP 模块化开发 的详细实践版。
开发痛点
我相信很多人,对 composer 不了解,在开发包的时候会这样做:
创建项目(jcc/new-package) -> 写业务逻辑 -> push 到代码仓库 -> 创建调试项目 -> 安装包(composer require jcc/new-package -vvv) -> 调试 -> 修改项目 -> push 更新代码 -> 在调试项目中更新包代码 (composer update -vvv) -> ...由此可见,不断重复的提交代码,更新代码,非常的麻烦,而且不能实时调试。
本文主要解决的问题:
本地开发包时,可本地测试,不需将代码提交到第三方代码仓库,再 composer require 安装到项目中测试:
创建项目(jcc/new-package) -> 写业务逻辑 -> 创建调试项目 -> 配置 composer.json -> 调试 -> 修改项目 -> 直接在调试项目调试 -> ...由此可见,本地开发可减少 git 提交拉取代码的时间,降低了提交的每一个版本尽可能出现的低级错误。
本地包开发的工作原理:
Composer 将本地开发的包通过软连接的方式,从新项目( jcc/taxi )软连接到调试项目( jcc/test-taxi/vendor/jcc/texi )
主要用到了 repositories 的 path 类型,更新信息请移步 文档
首先我们看一下 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 目录下运行:
composer init按照指示填写信息即可:
在 texi 目录下会多出 composer.json 文件:
{
"name": "jcc/taxi",
"description": "This is a test.",
"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.json 设置一下 composer 自动加载配置,在 composer.json 加入:
{
...,
"autoload": {
"psr-4": {
"Jcc\\Taxi\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"Jcc\\Taxi\\Tests\\": "tests/"
}
},
...
}更多可以看一下 Composer 自动加载文档
首先,在 jcc 目录下创建一个新的项目,用于测试:
jcc
├── taxi
└── test-taxi接着初始化 composer 配置,生成 composer.json 文件:
composer init然后添加 Repositories 项目,有两种方式:
第一种:直接运行命令
composer config repositories.jcc path /Users/jiajianchan/Sites/jcc/taxi第二种:直接在 composer.json 文件添加:
{
...,
"repositories": {
"jcc": {
"type": "path",
"url": "/Users/jiajianchan/Sites/jcc/taxi"
}
}
}type 类型为 path,url 为项目的相对路径.
接下来就是添加依赖,同样有两种方式:
Shell:
composer require jcc/taxi:dev-master -vvvcomposer.json 中添加:
{
...,
"require": {
"jcc/taxi": "dev-master"
},
...
}当然要注意版本号,必须在 jcc/taxi 项目中的 composer.json 中设置 minimum-stability 属性,不然在安装包的时候会报找不到版本号的错。首先在 jcc/taxi 项目下的 src 中创建 Client.php 文件:
<?php
namespace Jcc\Taxi;
class Client
{
protected $a;
protected $b;
public function __construct(int $a, int $b)
{
$this->a = $a;
$this->b = $b;
}
public function addTogether()
{
return $this->a + $this->b;
}
}在 jcc/test-taxi 目录下安装一下 jcc/taxi 项目后,添加 test.php 文件:
// 引入 composer 自动加载文件
require __DIR__ . '/vendor/autoload.php'
$client = new Jcc\Taxi\Client(5, 1);
echo $client->addTogether() . "\n";最后,在 jcc/test-taxi 目录下运行 test.php 文件,即可得出相加的结果:
php test.php如果你细心点,会发现,jcc/test-taxi 的 vendor 目录下的 jcc/taxi 依赖项目是一个 软连接。也就是说,你在 jcc/taxi 中的 Client.php 文件添加一个新方法,然后在 jcc/test-taxi 项目中调用即可,不需要重新 composer update 包哦。非常方便。
本地开发一个 Laravel 包做法基本与 Composer 包开发一样,简单过一下吧。
首先创建一个新的 Laravel 项目:
composer create-project laravel/laravel laravel -vvv在 Laravel 项目中创建如下目录:
laravel
├── app
├── ...
└── packages
└── jcc
└── taxi
├── LICENSE
├── README.md
├── composer.json
├── src
│ ├── Taxi.php
│ └── TaxiServiceProvider.php
└── testsjcc/taxi (vendor/name)为我们要发布的 Laravel 包,jcc对应为github username,taxi对应为项目名。
首先初始化 composer 配置,这个跟正常包开发没区别,然后在 jcc/taxi 下的 src 目录创建 TaxiServiceProvider.php 文件:
<?php
namespace Jcc\Taxi;
use Illuminate\Support\ServiceProvider;
class TaxiServiceProvider extends ServiceProvider
{
public function boot()
{
//
}
public function register()
{
$this->app->singleton('taxi', function () {
return new Taxi;
});
}
}创建 Taxi.php 文件:
<?php
namespace Jcc\Taxi;
class Taxi
{
public function printRunning()
{
echo 'running' . "\n";
}
}最后就是想包注册到 laravel 项目中,在 config/app.php 添加:
return [
...,
'providers' => [
...,
Jcc\Taxi\TaxiServiceProvider::Class,
],
];修改 laravel 项目下的 composer.json 文件:
{
...,
"autoload": {
...,
"psr-4": {
...,
"Jcc\\Taxi\\": "packages/jcc/taxi/src/"
}
},
...
}并运行命令:
composer dump-autoload最后在 web.php 中修改一下:
Route::get('/', function () {
app('taxi')->printRunning();
});此时,我们访问 laravel 项目的主页时,会显示 running 这个单词,则恭喜你,成功了。
开发一个包说难不难,说易也不易,最重要的是你需要有源源不断的创造力!
原网址: 访问
创建于: 2019-04-05 02:51:22
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论