【发布时间】:2017-01-07 15:40:21
【问题描述】:
我正在用 Go 编写一个应用程序。然而,在每个平台上,我的代码都将利用从另一个项目以另一种语言编译的外部程序(例如 Windows 中的 C++、Mac 中的 Objective-C 等)。使用os/exec exec.Command 函数调用此外部可执行文件。
我可以毫无问题地打包我的软件,但是仍然存在一个问题是使用go run 会导致此文件丢失。
每当我执行$ go run myproj 时,有没有办法告诉go 它应该包含外部文件(最好也从源代码构建)?
AFAIK,go run 只是在 tmp 目录下构建二进制文件,但它不会包含任何外部文件,例如图像等。例如,当您有两个文件时:$GOPATH/src/main/main.go 和 $GOPATH/ext-tool.bin 和 main.go内容是:
package main
import "os/exec"
func main() {
cmd := exec.Command("./ext-tool.bin")
err := cmd.Run()
if err != nil {
os.Exit(1)
}
}
【问题讨论】:
-
首先,你不应该在你的项目中使用
go run,使用go install或go build如果你需要包含一个二进制文件,你需要以某种方式在外部提供它,就像任何其他依赖项一样。 -
@JimB,我知道如何构建和打包我的应用程序。问题是我需要调试包含这个二进制文件。我能看到的所有调试器都在使用
go run,这就是问题所在。 -
哦,那么请确保可执行文件在您的 PATH 中,或者提供可执行文件的完整路径。您不应该依赖二进制文件中的相对路径。
-
@JimB 这就是我现在正在做的事情。然而,这是一个
coupled软件,所以如果我可以在每次调试器进程重新启动时自动重建并包含这个外部二进制文件,那么使用 go 应用程序调试它会容易得多。 -
您可以使用一些技巧来将其他内容包含在您的源代码中。您可能会去生成有用的东西,以及类似 fileb0x 的东西,如下所述 (stackoverflow.com/a/54028731/151312)
标签: go