如何将外部可执行文件添加到Go项目

如何将外部可执行文件添加到Go项目,go,Go,我正在用围棋写申请书。然而,在每一个平台上,我的代码将利用另一个语言(例如,Windows中的C++、Objto-C for MAC等)编译的外部程序。使用os/execexec.Command函数调用此外部可执行文件 我可以毫无问题地打包我的软件,但是有一个问题仍然存在,即使用go-run将导致此文件丢失 当我执行$go run myproj时,是否有办法告诉go它应该包含外部文件(最好也是从源代码构建的) 好的,go-run只是在tmp目录下构建二进制文件,但是它不包括任何外部文件,如图像等

我正在用围棋写申请书。然而,在每一个平台上,我的代码将利用另一个语言(例如,Windows中的C++、Objto-C for MAC等)编译的外部程序。使用
os/exec
exec.Command
函数调用此外部可执行文件

我可以毫无问题地打包我的软件,但是有一个问题仍然存在,即使用
go-run
将导致此文件丢失

当我执行
$go run myproj
时,是否有办法告诉
go
它应该包含外部文件(最好也是从源代码构建的)

好的,
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,我知道如何构建和打包我的应用程序。问题是我需要调试这个二进制文件。我看到的所有调试器都在使用
运行
,这就是问题所在。哦,那么请确保可执行文件在您的路径中,或者提供可执行文件的完整路径。您不应该依赖二进制文件中的相对路径。@JimB这就是我现在要做的。不过,这是一个耦合的软件,因此如果我可以在每次重新启动调试器进程时自动重建并包含此外部二进制文件,那么使用go应用程序调试它会容易得多。你可以做一些小动作,使其他内容包含在源代码中。您可以使用generate来提供帮助,还可以使用fileb0x之类的东西,如下所述(),这可能是一个选项。虽然不适用于我的情况,因为该可执行文件应该以不同的权限(suid)运行@AlexKey,但这不会有帮助吗?除非我以root用户身份运行它,否则它对我的案例毫无意义,因为我可以从一开始就将此功能嵌入到主应用程序中。这并不能解决在应用程序中有一些资源文件的更一般情况(比如图像没有转换成[]字节,而是作为普通文件等)。很少看到没有资源文件的应用程序……详细说明一下,
suid
,该应用程序由用户运行,但某些操作可能会使用根权限执行,因此此
外部二进制文件
是一个辅助工具,它设置了
suid
位以允许权限提升。这是执行此类案件的一种建议和常见方式。我用这种方式分发我的应用程序没有问题,但可测试性受到很大影响,因为我无法使用任何调试器来测试这些功能,因为我看到的所有调试器都使用
go run
,这意味着tmp目录和缺少的资源文件也在对问题的评论中提到了通过绝对路径加载这些资源,这将用于测试(我现在就是这么做的),但打包应用程序时,我必须将资源路径更改为relative,因为我不知道用户将在哪里安装应用程序。这也会影响协作,因为其他开发人员不能克隆这个项目并开始工作,他们必须首先“设置环境”,这意味着将这些文件复制到与其他人匹配的硬编码位置。