【问题标题】:How do I add external executable to Go project如何将外部可执行文件添加到 Go 项目
【发布时间】: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.binmain.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 installgo build 如果你需要包含一个二进制文件,你需要以某种方式在外部提供它,就像任何其他依赖项一样。
  • @JimB,我知道如何构建和打包我的应用程序。问题是我需要调试包含这个二进制文件。我能看到的所有调试器都在使用go run,这就是问题所在。
  • 哦,那么请确保可执行文件在您的 PATH 中,或者提供可执行文件的完整路径。您不应该依赖二进制文件中的相对路径。
  • @JimB 这就是我现在正在做的事情。然而,这是一个coupled 软件,所以如果我可以在每次调试器进程重新启动时自动重建并包含这个外部二进制文件,那么使用 go 应用程序调试它会容易得多。
  • 您可以使用一些技巧来将其他内容包含在您的源代码中。您可能会去生成有用的东西,以及类似 fileb0x 的东西,如下所述 (stackoverflow.com/a/54028731/151312)

标签: go


【解决方案1】:

另一种选择是将您的可执行文件嵌入到您的应用程序构建中。

这是通过go-bindata 或其更新的继任者unnoted/fileb0x 完成的。
在那里,您可以访问内存文件系统中的嵌入式可执行文件。

【讨论】:

  • 这可能是一个选择。虽然不适合我的情况,因为该可执行文件应该以不同的权限运行(suid)
  • @AlexKey 这不会有帮助吗? stackoverflow.com/a/21706757/6309
  • 除非我以 root 身份运行它,否则对我的情况没有意义,因为我可以从一开始就将此功能嵌入到主应用程序中。这并不能解决应用程序中有一些资源文件的更一般情况(比如图像没有转换为 [] 字节,而是作为普通文件等)。很少看到没有资源文件的应用程序......
  • 详细说明suid,该应用程序由用户运行,但某些操作应以root权限执行,因此此external binary是一个帮助工具,将suid位设置为允许特权升级。这是实施此类案例的推荐和常见方式。我以这种方式分发我的应用程序没有问题,但可测试性受到很大影响,因为我无法使用任何调试器来测试这些功能,因为我见过的所有调试器都使用go run,这意味着 tmp 目录和缺少资源文件
  • 同样在 cmets 中提到通过绝对路径加载这些资源的问题,这将适用于测试(这就是我现在所做的),但随后打包应用程序我必须更改资源相对路径,因为我不知道用户将在哪里安装应用程序。这也影响了协作,因为其他开发人员不能只是克隆这个项目并开始工作,他们必须首先“设置环境”,这意味着将这些文件复制到与其他人匹配的硬编码位置。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2016-10-17
  • 2011-05-26
  • 2011-01-23
相关资源
最近更新 更多