首页 > 解决方案 > 如何分发仅二进制包

问题描述

我想以二进制形式分发包而不包括源代码。

我的演示项目目录结构是这样的:

demo
├── greet
│   ├── greet.go
│   └── hi
│       └── hi.go
├── hello
│   └── hello.go
└── main.go

main.go:

package main

import (
    "fmt"
    "demo/greet"
    "demo/hello"
)

func main(){
    fmt.Println("greet:")
    greet.Greet()

    fmt.Println("hello:")
    hello.Hello()
}

问候.go

package greet

import (
    "demo/greet/hi"
    "fmt"
)

func Greet(){
    fmt.Println("Greet Call Hi")
    hi.Hi()
}

你好

package hi

import "fmt"

func Hi(){
    fmt.Println("Hi")
}

你好.go

package hello

import (
    "fmt"
    "demo/greet"
)

func Hello(){
    fmt.Println("hello call greet")
    greet.Greet()
}

我这样做:

[user@localhost greet]$ go install -a ./...

它在 $GOPATH/pkg/linux_amd64/demo 中生成了 greet.a 和 greet/hi.a。然后我编辑 hi.go 和 greet.go。

[user@localhost greet]$ cat greet.go
//go:binary-only-package

package greet
[user@localhost greet]$ cat hi/hi.go
//go:binary-only-package

package hi

然后我运行 main.go,我得到错误:

[user@localhost greet]$ cat hi/hi.go
# command-line-arguments
cannot find package demo/greet/hi (using -importcfg)
/home/user/go/pkg/tool/linux_amd64/link: cannot open file : open : no such file or directory

greet是我要分发的包。如果我删除包hi, main.go 可以运行良好。

demo
├── greet
│   └── greet.go
├── hello
│   └── hello.go
└── main.go

安装:

[user@localhost greet]$ go install .
[user@localhost greet]$ vim greet.go
//go:binary-only-package

package greet
[user@localhost greet]$ cd ..
[user@localhost demo]$ go run main.go
greet:
Greet ...
hello:
hello call greet
Greet ...
[user@localhost demo]$ 

所以我的主要问题是:我如何构建二进制库而其他人看不到我的源代码。并且包有很多子包。(如果包没有子包,我使用//go:binary-only-package方法可以很好地工作)

请帮助或尝试提供一些解决此问题的想法。提前致谢。

标签: go

解决方案


注意(2019):仅二进制包将不再受支持。

正如Go 1.12(2019 年 2 月)发行说明所述(遵循CL 152918):

仅二进制包

Go 1.12 是最后一个支持二进制包的版本

这在Go 问题 28152中有详细说明:

仅二进制包越来越难以安全地支持。

不能保证仅二进制包的编译使用与最终链接相同的依赖项版本(坚持这样做可能过于繁琐)。
因此,对于不再准确的依赖项,可能已使用转义分析结果或内联函数体编译了仅二进制包。
结果可能是静默内存损坏。

我的记忆是我们最初添加了仅二进制包,以便教授可以分发二进制解决方案集,以便没有完成实验 2 的学生仍然可以继续进行实验 3。
我不知道为什么其他人使用它们不再,但是随着编译器变得越来越复杂,它们可能会越来越多地崩溃。

这也在这里讨论过


推荐阅读