使用Go动态创建编译二进制文件

4

首先抱歉可能标题不太好,因为我不知道我要实现的东西的正确术语,所以遇到了很多困难。

在Go中,我希望能够创建一个程序,当运行时可以动态地创建一个辅助二进制文件。以下是一个简单的hello world示例的伪代码,仅供说明:

generator.go
-> Read in statement from statement.txt (i.e. "Hello World")
-> Insert this statement into the following program...

package main

import (
    "fmt"
)

func main(){
    fmt.Println([dynamic statement inserted here])
}

-> compile this code into subprogram

每当执行go run generator.go时,就会创建一个子程序二进制文件。 运行它将输出Hello World。 将statement.txt更改为其他内容并再次执行go run generator.go,将再次创建子程序,运行它将执行新语句。
简而言之,使用Go,我如何创建一个程序,可以动态地创建编译后的子程序作为输出。
谢谢。

2
这个问题是否可以使用 go-bindata 来解决? - user142162
1个回答

6

所以你有两个子任务,它们一起完成你想要的:

  1. 执行文本替换以获取最终源代码。
  2. 将最终源代码编译成可执行二进制文件。

1. 文本替换

第一个任务可以使用text/template包轻松完成。您可以将源模板作为单独的文件或嵌入到主Go源代码中(例如,作为常量)。

您可以使用template.ParseFiles()或使用template.New().Parse()来构建/解析源代码模板并获得Template。一旦您拥有模板,就可以组装(例如从文件加载)要包含在源模板中的值,并使用Template.Execute()运行它。现在您拥有了最终的源代码。

text/template包提供了强大的模板引擎,能够做比仅仅进行文本替换更多的事情。

注意:go的子包中还实现了一个Go解析器,可供您使用,但使用text/template包更简单,看起来足够并且完全适合您的情况。

2. 编译

要将最终源代码编译成可执行二进制文件,您需要编译器的帮助。您可以使用os/exec包调用编译器,该编译器将生成二进制文件。请参阅exec.Command()函数以获取Cmd,并使用Cmd.Run()Cmd.Start()来执行它。


在Gomega中有一个很好的编译步骤实现:https://github.com/onsi/gomega/blob/master/gexec/build.go。自己编写并不复杂,但是看到一个好的跨平台示例会很有帮助。 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接