热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Composer&Laravel包本地开发

本文参考超哥写的基于Composer的PHP模块化开发的详细实践版。开发痛点我相信很多人,对composer不了解,在开发包的时候会这样做:创建项目(jccnew-package)

《Composer & Laravel 包本地开发》

本文参考超哥写的 基于 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 包本地开发

首先我们看一下 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

按照指示填写信息即可:
《Composer & Laravel 包本地开发》

在 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 -vvv

composer.json 中添加:

{
...,
"require": {
"jcc/taxi": "dev-master"
},
...
}

当然要注意版本号,必须在 jcc/taxi 项目中的 composer.json 中设置 minimum-stability 属性,不然在安装包的时候会报找不到版本号的错。

开发以及测试

首先在 jcc/taxi 项目下的 src 中创建 Client.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 包本地开发

本地开发一个 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
└── tests

jcc/taxi (vendor/name) 为我们要发布的 Laravel 包,jcc 对应为 github usernametaxi 对应为 项目名

首先初始化 composer 配置,这个跟正常包开发没区别,然后在 jcc/taxi 下的 src 目录创建 TaxiServiceProvider.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 文件:

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 这个单词,则恭喜你,成功了。

开发一个包说难不难,说易也不易,最重要的是你需要有源源不断的创造力!


推荐阅读
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
author-avatar
yuanchengyc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有