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

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


推荐阅读
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • Composer 无法加载本地第三方库?如何解决这一常见问题 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 如何使用ES6语法编写Webpack配置文件? ... [详细]
  • 本文介绍了如何在GitHub上设置多个SSH Key,以解决原有Key失效的问题,并确保不同项目使用不同的私钥进行安全访问。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 了解如何在VSCode中通过配置文件自定义调试控制台的名称。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 如何在启用ECMAScript 6特性的情况下高效运行Node.js应用?本文将详细介绍如何在Node.js环境中启用并充分利用ES6的新特性,包括模块化、箭头函数、模板字符串等,以提升代码的可读性和开发效率。同时,文章还会探讨性能优化策略,确保应用在启用ES6特性后仍能保持高效运行。 ... [详细]
  • Vue CLI 初始化 Webpack 项目时,main.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社区 版权所有