Skip to main content

Go Generate & Makefile-番外篇

因為接下來如果要進行測試,勢必得在建立每個interface的時候都要新增一次mock interface,而且未來如果這個interface要擴增的時候,又得再重新輸入一次指令,所以在gomock官網中有提到,如果想要批次建立mock file,可以透過

go generate

來進行批量產生 go generate的原理是透過註解的方式,來執行後面的語法 所以可以搭配上mockgen一起使用 就可以如下

//go:generate mockgen -destination=mock/command.go -package=modelMock . ICommand
type ICommand interface {
Get() ([]schema.Command, error)
Save(input *schema.Command) (schema.Command, error)
UpdateOne(commandUuid string, command *schema.Command) (schema.Command, error)
Delete(commandUuid string) error
}

然後到根目錄執行

go generate ./...

而這個./...的意思是 ./ => 當前目錄 ... =>下面目錄的所有字串,以及所有路徑

參考#

https://stackoverflow.com/questions/28031603/what-do-three-dots-mean-in-go-command-line-invocations

只要這樣做,就可以將所有資料夾中檔案有go generate的都跑一遍了 go generate

那如果未來會忘記這段指令怎麼辦呢 這時候,就用到另一個小工具 Makefile 這個工具可以幫我們把很多系統上的使令統一放到一個檔案中,然後透過

make xxxxx

來執行 那這個檔案寫法如下

.PHONY: generate run
run:
go run .
generate:
go generate ./...

然後在你存放Makefile的路徑下執行

make generate

他就會幫你執行

go generate ./...

Makefile

至於.PHONY是什麼呢 因為這個Makefile除了執行指令,其實主要是拿來做compile用的,所以會建議,如果你在執行的指令,如果她就只是指令,而不是檔案的話,就把它放到.PHONY後面,因為放在.PHONY裡的內容,Makefile在執行的時候,才會去辨別他有沒有改變 舉個例子 如果剛好有個檔案叫做generate 然後你第一次執行

make generate

他會去正常實行 go generate ./... 但第二次執行時 因為generate沒有在.PHONY中,所以Makefile在判斷的時候,就會覺得你的generate沒有變動,就不會去執行go generate ./...了 詳細的內容可以到網路上查看更多資料,我這邊就僅用在執行指令

附上這次的comment紀錄 https://github.com/kevinyay945/smart-home-backend/tree/v0.5.2