通過命令行(MacOS)_test.go使用時,可以排除文件go run。go run $(ls -1 dir/*.go | grep -v _test.go)但是,似乎通過Go makefile并沒有以類似的方式使用該命令。例如,start:
go run $(ls -1 dir/*.go | grep -v _test.go)和start:
go run `$(ls -1 dir/\*.go | grep -v _test.go)`兩者都會導致go run: no go files listedgrep在Go Makefile中使用和類似命令的正確方法是什么?
2 回答

手掌心
TA貢獻1942條經(jīng)驗 獲得超3個贊
美元符號具有特殊的制造意義:它們引入了make變量和函數(shù)。如果要在配方中使用文字美元符號,則需要通過將其加倍來對其進行轉義:
start: go run $$(ls -1 dir/*.go | grep -v _test.go)

慕雪6442864
TA貢獻1812條經(jīng)驗 獲得超5個贊
正如在另一個答案中已經(jīng)提到的那樣,簡單的解決方案是將所有美元符號加倍,以防止Make嘗試將它們解釋為Make變量或函數(shù)。等效地,您可以將過時的命令替換語法`ls ... stuff`
與反引號一起使用,而不是 $(ls ... stuff)
但是,這種方法從根本上來說是有缺陷的,因為它陷入影響解析ls
輸出的極端情況的深淵。一種更可靠的方法是使用Make函數(shù)來表達模式。
go run $(filter-out %_test.go,$(wildcard dir/*.go))
我還將提到Bash具有一個稱為擴展的globlob(google extglob
)的功能,您可以在其中說一些類似于!(dir/*_test.go)dir/*.go
從通配符匹配中排除文件集的內容。但是,當Make具有提供相同功能的內置功能時,您可能不想破壞Makefile的可移植性(盡管語法更為冗長。實際上,這是一個功能,因為它使新維護者可以輕松地進行操作) google函數(shù)名稱并找出代碼的作用?。?/p>
- 2 回答
- 0 關注
- 294 瀏覽
添加回答
舉報
0/150
提交
取消