自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

我是照着教程(learnku 的 LX2 教程)写了一个包. 开发完成后, 因为扩展包依赖 laravel 的模型类和数据库连接.所以需要将开发中的包复制到一个laravel项目下进行测试.

这里主要是扩展包需要操作数据库.一开始想的是.如果这个包将来只在laravel项目中使用,那么在扩展包中使用模型类,并且继承框架的模型基类再建好对应的数据表.通过laravel的数据库连接和模型基类就可以实现数据库操作了.

一开始想的特别简单, 因为平常用的很方便. 只要 composer require 扩展包的名称 然后项目中就可以直接 use ,然后 new 出来了. 然后平常安装的包总是 vendor 下, 所以就自己新建了一个 laravel 项目, 在 vendor 下新建了一个目录然后把包 copy 到了 目录下; 如下图所示:

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

bboyyue 是我自己的名字, keyword 是扩展包的名字.
然后编写单元测试,发现没有加载进来.

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

然后此时就特别奇怪,咨询了大佬,大佬说我可以直接在 psr-4 下面手动写上 命名空间和扩展包的路径,就可以自动加载.

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

这里注意加 src 是没错的. 我一开始没加, 大佬给与了指正.但是加完还是不行,依旧是 Class not found.

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

大佬又给予了我很多的提醒和指导:smile: :smile:, 包括左边应该是扩展包中使用的命名空间, 右边不要多加 / 或者 \ .以及 修改自动加载项之后要注意. composer dump-auto . 依旧不行. 后来了解到大佬使用 tp 比较多. 他一般都是在根目录下新建 packagist 目录, 然后右边一般都是 packagist/user/扩展包的名称/src 这样的路径. 于是我把我的右边改成了 vendor/user/扩展包的名称/src 这样的路径.

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

终于不是 not found 了.
但是到这里还是不理解.为什么别的 vendor 下的包都不需要加 vendor . 我的就需要 (别的不在 psr-4 这里写:smile:)

然后查看 autoload.php 文件.

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

当我的右边的路径包含 vendor 的时候, composer dump_auto 后的 autoload_psr4.php 中 Bboyue\Keyword\ 的对应值里面的变量就会变成 $vendor, 反之就会变为 $base. $base 是根目录.所以大佬的 tp5 直接放在根目录或者新建目录的方式也可以自动加载. 看到这里, 问题基本上已经解决了. 但是有时候研究了半天,不研究的明明白白就睡不着. 所以又查看了 composer 的源码.
了解了 composer dump-auto 的原理.

  1. 找到 dump-auto 的文件

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

  1. 发现这里有一个 dump 方法

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

  1. dump 方法是上面 getAutoloadGenerator() 返回的类的实例 (AutoloadGenerator)

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

  1. 找到dump方法

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

  1. 可以看到 dump-auto 最后把 php 代码写入到了 autoload_psr4.php ,然后这里通过 getPathCode() 方法对路径进行了验证,如果包的路径中如果包含了 $vendorPath 就会返回 $vendorDir;

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

自己编写的 Packagist 包如何在不发布的情况下实现自动加载

  1. $package 在$composer 初始化没多久就已经有了, 怀疑是在初始化的时候就已经读取到内存了.
    今天晚上不行了, 明天还要上班 :persevere:

—– 作者是小白,以上所有的分析仅供参考.如有错误 欢迎指正.

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
fatrbaby

composer.json配一配就能完成,哪儿这么费劲啊。

3年前 评论
徵羽宫 (楼主) 3年前

composer.json可以配置 repositories为本地文件路径

3年前 评论
徵羽宫 (楼主) 3年前

搜索:composer 本地包

3年前 评论

被你搞的太复杂了。

3年前 评论
徵羽宫 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!