自己編寫的 Packagist 包如何在不釋出的情況下實現自動載入

徵羽宮發表於2020-10-27

我是照著教程(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 協議》,轉載必須註明作者和本文連結

相關文章