Golang:使用 air 熱重啟

前言

在 Web 開發(fā)中匈勋,熱重啟在很多地方都會(huì)用到,它能極大提升開發(fā)效率庆揩,在我們修改完代碼后保存俐东,就能自動(dòng)重啟運(yùn)行得到最新的代碼的運(yùn)行結(jié)果,比如前端開發(fā)的 HMR 就是一個(gè)典型的例子盾鳞。

Go 語言中的熱重啟

在 Go 語言開發(fā)中實(shí)現(xiàn)熱重啟犬性,推薦使用 air ,自 Go1.4 出來腾仅,官方就推薦使用 Go Modules 管理依賴,來進(jìn)行模塊化開發(fā)套利,那么我們就使用 Go Modules 構(gòu)建我們的項(xiàng)目(注意:我使用的版本是 Go1.3)推励。首先創(chuàng)建一個(gè)項(xiàng)目目錄如: go-restart 鹤耍,然后進(jìn)入目錄,在該目錄下執(zhí)行終端命令初始化 Go Modules:

go mod init github.com/startdusk/go-restart

注意 github.com/startdusk/go-restart 只是一個(gè)模塊名验辞,你可以把它命名成其他的命名

然后就會(huì)在目錄下生成一個(gè) go.mod 文件


然后我們安裝 air (注意:還是在當(dāng)前目錄下執(zhí)行)

go get -v -u github.com/cosmtrek/air

安裝完成后稿黄,在終端執(zhí)行 air ,有一下輸出即為安裝成功:


我們先創(chuàng)建一個(gè) main.go 文件跌造,寫點(diǎn)簡單代碼:

// main.go
package main

import "fmt"

func main() {
    fmt.Println("air test")
}

到這里杆怕,我們還需要?jiǎng)?chuàng)建一個(gè) .air.conf 的配置文件(.air.conf 是默認(rèn)命名)】翘埃可以從 air 項(xiàng)目中的 air_example.conf 復(fù)制配置內(nèi)容陵珍,進(jìn)行一些修改。
有幾個(gè)要注意的地方:

  • 1.[build] 下的 cmd 配置默認(rèn)是 go build -o ./tmp/main .违施,很可能你需要修改互纯,比我當(dāng)前的項(xiàng)目就必須修改為 go build -o ./tmp/main github.com/startdusk/go-restart/main.go
  • 2.include_ext 和 exclude_dir 是配置避免監(jiān)控不必要的文件和目錄
  • 3.如果該項(xiàng)目有版本管理如 git ,要把 tmp 目錄加入 .gitignore 中(因?yàn)檫\(yùn)行 air 會(huì)生成的文件放在 tmp 文件夾中)
  • 4.如果出現(xiàn) watch error, open tool many files…磕蒲,說明要監(jiān)控的文件太多留潦,一方面確保修改了了 include_ext 和 exclude_dir,另一方面可以通過 ulimit -n 5000 調(diào)大進(jìn)程允許打開的文件數(shù)

那么修改后的 .air.conf 文件就變?yōu)榱耍?/p>

# Config file for [Air](https://github.com/cosmtrek/air) in TOML format

# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "tmp"

[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ./tmp/main github.com/startdusk/go-restart/main.go"
# Binary file yields from `cmd`.
bin = "tmp/main"
# Customize binary.
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
# Watch these filename extensions.
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these filename extensions or directories.
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# Watch these directories if you specified.
include_dir = []
# Exclude files.
exclude_file = []
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop to run old binary when build errors occur.
stop_on_error = true
# This log file places in your tmp_dir.
log = "air_errors.log"

[log]
# Show log time
time = false

[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
# Delete tmp directory on exit
clean_on_exit = true

此時(shí)目錄結(jié)構(gòu)為:



好了辣往,到此我們可以在命令行運(yùn)行代碼:

air

然后輸出:



程序成功運(yùn)行兔院,并且 air 在監(jiān)聽文件的變化,那我們嘗試下改動(dòng)下代碼:

// main.go
package main

import "fmt"

func main() {
    fmt.Println("air test")
    fmt.Println("air listen")
}

然后控制臺(tái)輸出:



查看結(jié)果站削,air 成功監(jiān)聽到了文件的變化坊萝,并重新運(yùn)行了程序。

那么钻哩,上面的粉紅色的輸出一些異常屹堰,大家可以去看一下這個(gè) issue #53,windows 平臺(tái)會(huì)出現(xiàn)這個(gè)問題街氢,但不是很影響使用扯键。但這個(gè) air 目前還不能配合 VSCode 熱重啟加調(diào)試模式使用(如 nodejs 的 nodemon+VSCode 是可以實(shí)現(xiàn)熱重啟加調(diào)試模式啟動(dòng)的),有點(diǎn)遺憾珊肃。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荣刑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伦乔,更是在濱河造成了極大的恐慌厉亏,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烈和,死亡現(xiàn)場(chǎng)離奇詭異爱只,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)招刹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門恬试,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窝趣,“玉大人,你說我怎么就攤上這事训柴⊙剖妫” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵幻馁,是天一觀的道長洗鸵。 經(jīng)常有香客問我,道長仗嗦,這世上最難降的妖魔是什么膘滨? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮儒将,結(jié)果婚禮上吏祸,老公的妹妹穿的比我還像新娘。我一直安慰自己钩蚊,他們只是感情好贡翘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砰逻,像睡著了一般鸣驱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝠咆,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天踊东,我揣著相機(jī)與錄音,去河邊找鬼刚操。 笑死闸翅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菊霜。 我是一名探鬼主播坚冀,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鉴逞!你這毒婦竟也來了记某?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤构捡,失蹤者是張志新(化名)和其女友劉穎液南,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾徽,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滑凉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬涡。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闪幽,死狀恐怖啥辨,靈堂內(nèi)的尸體忽然破棺而出涡匀,到底是詐尸還是另有隱情,我是刑警寧澤溉知,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布陨瘩,位于F島的核電站,受9級(jí)特大地震影響级乍,放射性物質(zhì)發(fā)生泄漏舌劳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一玫荣、第九天 我趴在偏房一處隱蔽的房頂上張望甚淡。 院中可真熱鬧,春花似錦捅厂、人聲如沸贯卦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撵割。三九已至,卻和暖如春辙芍,著一層夾襖步出監(jiān)牢的瞬間啡彬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工故硅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庶灿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓吃衅,卻偏偏與公主長得像往踢,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捐晶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1菲语、第八章 Samba服務(wù)器2、第八章 NFS服務(wù)器3惑灵、第十章 Linux下DNS服務(wù)器配站點(diǎn)山上,域名解析概念命令:...
    哈熝少主閱讀 3,741評(píng)論 0 10
  • 第一章 1.Linux是一套免費(fèi)使用和自由傳播的類UNIX操作系統(tǒng),它可以基于Intel x86系列處理器以及Cy...
    yansicing閱讀 5,461評(píng)論 0 9
  • 1英支、文件和目錄: # cd /home 進(jìn)入 '/home' 目錄 # cd .. ...
    XDgbh閱讀 2,014評(píng)論 0 1
  • 第 2 章 SHELL 基礎(chǔ)知識(shí)2.1 shell腳本我們?cè)谏厦婧唵谓榻B了一下什么是shell腳本佩憾,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,577評(píng)論 0 0
  • 今年的情人節(jié),變成了"擒人節(jié)",2月在家隔離14天還只是個(gè)看不到結(jié)束的開始 長隔漫漫,推薦一款走淚的游戲讓大家舒緩...
    hhwwxxx閱讀 187評(píng)論 0 0