iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
自我挑戰組

用Unity製作連線遊戲系列 第 27

Go Reload via Air

  • 分享至 

  • xImage
  •  

今天花了一些時間了解要怎麼樣進行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變成不怎麼好用。不過也可能是用法不對,還要再研究。


上一篇
Monorepo and Build
下一篇
Local Build Setup
系列文
用Unity製作連線遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言