自己编写的 Packagist 包如何在不发布的情况下实现自动加载
自己编写的 Packagist 包如何在不发布的情况下实现自动加载
我是照着教程(learnku 的 LX2 教程)写了一个包. 开发完成后, 因为扩展包依赖 laravel 的模型类和数据库连接.所以需要将开发中的包复制到一个laravel项目下进行测试.
这里主要是扩展包需要操作数据库.一开始想的是.如果这个包将来只在laravel项目中使用,那么在扩展包中使用模型类,并且继承框架的模型基类再建好对应的数据表.通过laravel的数据库连接和模型基类就可以实现数据库操作了.
一开始想的特别简单, 因为平常用的很方便. 只要 composer require 扩展包的名称 然后项目中就可以直接 use ,然后 new 出来了. 然后平常安装的包总是 vendor 下, 所以就自己新建了一个 laravel 项目, 在 vendor 下新建了一个目录然后把包 copy 到了 目录下; 如下图所示:
bboyyue 是我自己的名字, keyword 是扩展包的名字.
然后编写单元测试,发现没有加载进来.
然后此时就特别奇怪,咨询了大佬,大佬说我可以直接在 psr-4 下面手动写上 命名空间和扩展包的路径,就可以自动加载.
这里注意加 src 是没错的. 我一开始没加, 大佬给与了指正.但是加完还是不行,依旧是 Class not found.
大佬又给予了我很多的提醒和指导
, 包括左边应该是扩展包中使用的命名空间, 右边不要多加 / 或者 \ .以及 修改自动加载项之后要注意. composer dump-auto . 依旧不行. 后来了解到大佬使用 tp 比较多. 他一般都是在根目录下新建 packagist 目录, 然后右边一般都是 packagist/user/扩展包的名称/src 这样的路径. 于是我把我的右边改成了 vendor/user/扩展包的名称/src 这样的路径.
终于不是 not found 了.
但是到这里还是不理解.为什么别的 vendor 下的包都不需要加 vendor . 我的就需要 (别的不在 psr-4 这里写)
然后查看 autoload.php 文件.
当我的右边的路径包含 vendor 的时候, composer dump_auto 后的 autoload_psr4.php 中 Bboyue\Keyword\ 的对应值里面的变量就会变成 $vendor, 反之就会变为 $base. $base 是根目录.所以大佬的 tp5 直接放在根目录或者新建目录的方式也可以自动加载. 看到这里, 问题基本上已经解决了. 但是有时候研究了半天,不研究的明明白白就睡不着. 所以又查看了 composer 的源码.
了解了 composer dump-auto 的原理.
- 找到 dump-auto 的文件
- 发现这里有一个 dump 方法
- dump 方法是上面 getAutoloadGenerator() 返回的类的实例 (AutoloadGenerator)
- 找到dump方法
- 可以看到 dump-auto 最后把 php 代码写入到了 autoload_psr4.php ,然后这里通过 getPathCode() 方法对路径进行了验证,如果包的路径中如果包含了 $vendorPath 就会返回 $vendorDir;
- $package 在$composer 初始化没多久就已经有了, 怀疑是在初始化的时候就已经读取到内存了.
今天晚上不行了, 明天还要上班
—– 作者是小白,以上所有的分析仅供参考.如有错误 欢迎指正.
本作品采用《CC 协议》,转载必须注明作者和本文链接
getcomposer.org/doc/05-repositorie...
composer.json配一配就能完成,哪儿这么费劲啊。
composer.json可以配置 repositories为本地文件路径
搜索:composer 本地包
被你搞的太复杂了。