如何在没有 Go 源代码的情况下使用/分发二进制包

Bry*_*Toh 5 go

基本上我的文件夹结构如下:

bin/               
pkg/
    linux_amd64/         
        github.com/user/
            stringutil.a  
src/
    github.com/user/
        hello/
            hello.go   (main file)  
        stringutil/
            stringutil.go
Run Code Online (Sandbox Code Playgroud)

hello.go是从 导入一些函数的主程序stringutil.go

运行后go install,在(如上)stringutil.a下创建。pkg

我的问题是,既然我已经有了源,我可以在go install没有源的情况下再次运行吗?stringutil.gostringutil.a

我是一名 Java 程序员,也是 Go 新手。通常在Java中,在编译时,我们可以将编译好的jar文件导入到classpath中进行编译。

我怎样才能在 Go 中做同样的事情?如果我有一个编译好的包,stringutil.a我怎样才能将该文件分发给某人并让他们使用它而不暴露原始源代码?

icz*_*cza 4

您将编译的包放入错误的文件夹中。

Go 工作区的文件pkg夹包含已编译的包对象,这些对象根据它们编译到的目标架构组织成子文件夹,例如linux_amd64windows_amd64。其中父包的路径如下,直接父文件夹是放置编译后的包对象的地方。

检查go install包对象的放置位置,并镜像该文件夹结构。

因此,例如,如果您的包是path/to/parent/package/abc并且编译为 linux 64 位,则应将其编译后的包文件放入以下文件夹中:

myworkspace/pkg/linux_amd64/path/to/parent/package/abc.a
Run Code Online (Sandbox Code Playgroud)

或者如果是 Windows 64 位:

myworkspace/pkg/windows_amd64/path/to/parent/package/abc.a
Run Code Online (Sandbox Code Playgroud)

此页面为您提供更多详细信息:如何编写 Go 代码

笔记:

通过这样做,您将限制编译应用程序的可能目标,因为编译的包对象仅适用于特定平台。在 Go 中分发包的首选方式是源代码形式。