通过命令行(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 listed
在Go Makefile中使用grep
和类似命令的正确方法是什么?
答案 0 :(得分:2)
美元符号很特殊:它们引入了make变量和函数。如果您想在配方中使用文字美元符号,则需要通过将其加倍来对其进行转义:
start:
go run $$(ls -1 dir/*.go | grep -v _test.go)
答案 1 :(得分:1)
正如在另一个答案中已经提到的那样,简单的解决方案是将所有美元符号加倍,以防止Make试图将它们解释为Make变量或函数。等效地,您可以将带有过时命令替换语法`ls ... stuff`
与反引号代替 $(ls ... stuff)
但是,该方法从根本上来说是有缺陷的,因为它会陷入影响parsing ls
output的极端情况的深渊。一种更健壮的方法是使用Make函数来表达模式。
go run $(filter-out %_test.go,$(wildcard dir/*.go))
我还会提到Bash具有称为扩展的球状搜索(谷歌extglob
)的功能,在其中您可以说类似!(dir/*_test.go)dir/*.go
的内容来从通配符匹配。但是,当Make具有提供相同功能的内置功能时(尽管语法更加冗长),您可能不想破坏Makefile的可移植性。实际上,这是一个功能,因为它使新维护者可以轻松地进行操作。 google函数名称并找出代码的作用!)