通过命令行(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条经验 获得超3个赞
美元符号具有特殊的制造意义:它们引入了make变量和函数。如果要在配方中使用文字美元符号,则需要通过将其加倍来对其进行转义:
start: go run $$(ls -1 dir/*.go | grep -v _test.go)
慕雪6442864
TA贡献1812条经验 获得超5个赞
正如在另一个答案中已经提到的那样,简单的解决方案是将所有美元符号加倍,以防止Make尝试将它们解释为Make变量或函数。等效地,您可以将过时的命令替换语法`ls ... stuff`
与反引号一起使用,而不是 $(ls ... stuff)
但是,这种方法从根本上来说是有缺陷的,因为它陷入影响解析ls
输出的极端情况的深渊。一种更可靠的方法是使用Make函数来表达模式。
go run $(filter-out %_test.go,$(wildcard dir/*.go))
我还将提到Bash具有一个称为扩展的globlob(google extglob
)的功能,您可以在其中说一些类似于!(dir/*_test.go)dir/*.go
从通配符匹配中排除文件集的内容。但是,当Make具有提供相同功能的内置功能时,您可能不想破坏Makefile的可移植性(尽管语法更为冗长。实际上,这是一个功能,因为它使新维护者可以轻松地进行操作) google函数名称并找出代码的作用!)
- 2 回答
- 0 关注
- 269 浏览
添加回答
举报
0/150
提交
取消