“生成”多行命令

时间:2019-04-09 18:18:17

标签: go code-generation

我试图在编译代码之前使用//go:generate运行外部工具,并且由于我需要传递一定数量的参数,因此行变得相当长。

似乎无法编写多行go:generate命令,对吗?有替代方法吗?

谢谢

2 个答案:

答案 0 :(得分:2)

无法将go generate命令分成几行,但是有一些技巧。

如果您需要运行多个短命令,则可以像下面这样一一编写。

//go:generate echo command A
//go:generate echo command B
//go:generate ls

您还应该知道没有bash脚本,而是原始命令。因此,以下工作并非您所期望的。

//go:generate echo something | tr a-z A-Z > into_file
// result in "something | tr a-z A-Z > into_file"

对于冗长或复杂的命令,您应该使用从go:generate注释调用的单独脚本(或go程序)。

//go:generate generate.sh
//go:generate go run generator.go arg-A arg-B

在generator.go中,您应该使用build标记来防止它与其他文件正常编译。

// +build ignore

package main
// ...

学习围棋的最佳地方是围棋来源:https://github.com/golang/go/blob/master/src/runtime/runtime.go#L13

答案 1 :(得分:0)

这远非理想的解决方案,但您可以使用以下形式的指令

//go:generate -command <alias> <command-with-parameters>

上述指令指定,仅针对当前源文件的其余部分<alias> 等效于命令 <command-with-parameters>

此方法可能对您有用,因为您提到需要传递一定数量的参数(我假设有很多)。您可以潜在地使用它来模拟单个换行符。我说单个是因为嵌套别名不起作用(至少现在是这样)。

示例:

//go:generate BAKE "ramen"


  // The above go:generate directive does NOT work, unless:
  //  - You somehow have bake on your path.
  //  - You did a `//go:generate -command BAKE ...`


/* Now, assuming you have a command `kitchen-tools` with lots of possible parameters... */

//go:generate -command BAKE kitchen-tools -appliance=sun -temp=5800K -time=1ns 
//go:generate BAKE -panic=if-burnt -safety=fire_extinguisher,mitts "fresh pizza"


  // The previous //go:generate line runs the following command:
  //  kitchen-tools -appliance=sun -temp=5800K -time=1ns -panic=always -safety=fire_extinguisher,mitts "fresh pizza"

/* BAKE can be used as many times as necessary for the rest of the file. For instance... */

//go:generate BAKE -no-return -unsafe "grand piano"
  

此外,我建议您使用构建标记 generate(而不是像 ignore 这样的东西),因为 go generate 工具在检查您的文件时会设置构建标记 generate

// +build generate

package main
// ...