喺用Docker之前,我嘅Laravel工作流好簡單,但都好重複。每次想開始一個項目,都要開個終端機跑php artisan serve,然後再開多個終端機跑npm run dev。佢用得,但好麻煩。
Laravel Sail改變咗呢一切。一句sail up -d,一切就都跑起身。PHP、數據庫、Web伺服器,全部喺Docker入面。再唔使每次都手動啟動開發伺服器。
好奇心
有段時間,我開始好奇可唔可以喺Docker以外、直接喺macOS上原生跑PHP。老實講,一開始幾令人困惑。我去年先攞到自己嘅Mac,對macOS嘅開發生態完全唔熟悉。我唔知道應該由邊度開始,亦唔知道有邊啲工具可用。第一反應就係去搜「Mac PHP 執行方法」。
一搜就一頭栽入咗Homebrew安裝PHP、管理多個版本、設定Nginx、手動搭建數據庫嘅兔子洞入面。同我習慣嘅一句sail up相比,呢個感覺需要打理嘅嘢實在太多喇。
發現DBngin同Laravel Herd
然後我搵到兩個改變一切嘅工具。
DBngin係一款Mac上嘅免費應用程式,可以喺本地一撳就啟動數據庫服務:PostgreSQL、MySQL或Redis。佢本身唔係數據庫管理工具,要管理數據就要配合TablePlus(同一個團隊做嘅)使用。DBngin負責跑服務,TablePlus負責瀏覽同管理數據。喺DBngin入面撳一下Start,數據庫就喺localhost上跑起身。
Laravel Herd係一個專門為Laravel打造嘅原生macOS開發環境。佢會自動處理PHP、Nginx同DNS。裝好嗰一刻起,你嘅Laravel項目就可以透過your-project.test訪問,唔使設定,亦唔使手動啟動伺服器。佢甚至連SSL都幫你搞掂晒。
恍然大悟嘅一刻
Herd最令我印象深刻嘅地方,係站點連結呢件事。用Sail嘅時候,我嘅項目跑喺localhost上;用Herd,佢即刻就可以喺humfurie.test上訪問。唔使編輯hosts檔案,唔使設定虛擬主機,佢就係直接可以用。
開發體驗都明顯更快咗。因為PHP係原生運行,而唔係跑喺容器入面,所以冇Docker檔案系統嘅開銷。頁面加載更快,artisan命令都係瞬間執行。
咁Laravel Valet呢?
如果你喺搵Herd嘅免費替代品,有Laravel Valet。實際上,呢個正正係Herd嘅底層基礎:同樣嘅概念(Nginx、DnsMasq、自動.test域名),只係冇圖形介面。你透過Composer安裝佢,一切都喺終端機入面管理。
Herd本質上就係加咗一層精緻介面、內建PHP版本管理,以及自動SSL之類附加功能嘅Valet。如果你唔介意喺命令列度操作,Valet可以免費畀你同樣嘅核心體驗。
踩過嘅坑
呢次遷移並唔係完全無縫嘅,有幾個地方令我卡住咗。
數據庫連接:我嘅.env檔案係為Docker內部主機名設定嘅。脫離Docker之後,我需要改成localhost,並確保數據庫嘅設定值都同DBngin實際運行嘅對得上。
Node模組:我嘅node_modules係喺Docker容器(Linux ARM)入面安裝嘅,所以缺少macOS原生二進位檔案。重新安裝一次node_modules就解決咗。
PHP版本差異:Herd跑嘅係PHP 8.5,而我嘅Docker設定用嘅係PHP 8.4。呢個暴露咗一啲喺新版本入面被重新命名嘅PDO常量嘅棄用警告。
廣告攔截器:呢個係意料之外嘅。我瀏覽器嘅廣告攔截器將Vite開發伺服器嘅請求擋住咗,頁面加載出嚟就係一片黑屏,直到我將嗰個域名加入白名單先解決。
咁到底邊個更好?
兩者都有各自嘅用武之地。
Sail更適合團隊一致性、CI/CD對齊,以及你想令開發環境完全對應生產環境嘅場景。如果你用嘅係Linux,佢亦係唯一嘅選擇。
Herd加DBngin更適合單人開發、追求速度同簡潔嘅macOS環境。原生效能同自動.test域名令日常工作流更暢順。
我兩個都留住用。Sail作為一個基於Docker嘅選項留喺倉庫入面用於開發,部署時我仲有一套獨立嘅生產環境Docker Compose設定。日常本地開發就由Herd負責。喺Sail同Herd之間切換,不過係改一改.env檔案指向邊個數據庫主機嘅事。