go - 如何分发仅二进制包
问题描述
我想以二进制形式分发包而不包括源代码。
我的演示项目目录结构是这样的:
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
方法可以很好地工作)
请帮助或尝试提供一些解决此问题的想法。提前致谢。
解决方案
注意(2019):仅二进制包将不再受支持。
正如Go 1.12(2019 年 2 月)发行说明所述(遵循CL 152918):
仅二进制包
Go 1.12 是最后一个支持二进制包的版本。
这在Go 问题 28152中有详细说明:
仅二进制包越来越难以安全地支持。
不能保证仅二进制包的编译使用与最终链接相同的依赖项版本(坚持这样做可能过于繁琐)。
因此,对于不再准确的依赖项,可能已使用转义分析结果或内联函数体编译了仅二进制包。
结果可能是静默内存损坏。我的记忆是我们最初添加了仅二进制包,以便教授可以分发二进制解决方案集,以便没有完成实验 2 的学生仍然可以继续进行实验 3。
我不知道为什么其他人使用它们不再,但是随着编译器变得越来越复杂,它们可能会越来越多地崩溃。
推荐阅读
- php - laravel 在验证 FormRequest 后返回 json 错误而不是重定向
- python - 为什么从数组运行切片需要额外的时间?
- python - python中是否有类似于MATLAB中的peaks(N)的函数/实现?
- performance - 如何使用 jmeter 对完整的逻辑流程进行负载测试?
- javascript - 异步/等待功能不等待
- bootstrap-4 - 容器超出 jumbotron
- flutter - 错误无法在此小部件上方找到正确的提供程序
- powershell - 有没有办法在对象创建时向用户显示 Powershell 类构造函数的可用重载,而不是让它们通过管道将其传递给 GM?
- python - 如何在 Pandas 中抑制科学记数法并在折线图末尾添加标签?
- javascript - 如何在 Asp.net 上实现 AgoraIO