今天花了一些時間了解要怎麼樣進行go開發時的hot reload,先說結論,就目前了解的狀況來說,相當的不好用,不過多半是我自己對於go開發環境不熟所造成的。
日前花了些時間了解nodejs中如何在container裡利用nodemon進行開發,走了不少冤枉路最後才知道要在docker的環境變數裡加上
environment:
- CHOKIDAR_USEPOLLING=true
而這次使用air,利用文件裡docker的使用方式
docker run -it --rm \
-w "/go/src/github.com/cosmtrek/hub" \
-v $(pwd):/go/src/github.com/cosmtrek/hub \
-p 9090:9090 \
cosmtrek/air
但這裡不了解的地方是**-w**這個參數不知道要做什麼,又好像不是docker的參數,不放又會有問題。也就因為這個原因,一直無法用docker跑,所以就換個方式,開container後,在裡頭直接裝air,並直接執行,可是又碰到了host變更但container裡沒有變更。想說一定是和nodejs的情況一樣,直接加入環境變數CHOKIDAR_USEPOLLING,仍是host變更沒有被反應到。
這時直覺得想法是會不會是air沒有做用,只好試著用interactive shell去看container,裝了vim(用go image要額外裝)後,在docker compose執行container裡的air時,去變更程式碼,很順利的,程式一改變,就會進行調整。這時在用host去調整程式碼,就是沒有反應。
好吧,只能說在air的設計考量中並沒有考慮到在container裡這樣的用法,而且若是在root project裡沒有go檔,也會造成一開始時就有問題,無法建置的情況。試著加上了.air.conf檔,但沒有太大的效果。找到的幾篇文章,也沒有看到太多的訊息。
但5種方式裡,有提及用gin框架也可以reload,不過目前沒有要加入gin的部份,但或許可以嘗試一下。而另一個方式是直接用nodemon,看起來怪怪地但或許是最簡單就可以達成重載的方式。而文中提及的fresh,算是air參考的專案,也好一陣子沒有更新了,不太想花時間去試。若是air的專案裡有example可以參考就好了,可以少花一些時間。
或許air就是不能夠進入到container的世界裡吧,要不然就go的container用法和nodejs有很多地方不一樣。若是嘗試後仍沒有很好的方案,或許要思考build tool的方法進行,但昨天找到的bazel,那又是另一個不容易了解的部份。
希望能在這幾天想到更好的方案。
Update: 利用Nodemon可以做到reloading,但這個機制有缺點。如果一碰到compile部份有問題,就會直接退出,但正常的reload就算是有compile error也應該不會離開,而是出現錯誤後,修正完又會再度重載。否則在開發時本來就會有編譯不過的問題發生,而且是經常性的,這點就讓nodemon變成不怎麼好用。不過也可能是用法不對,還要再研究。