我想以二进制形式分发包而不包含源代码。
我的演示项目目录结构是这样的:
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()
}
greet.go
package greet
import (
"demo/greet/hi"
"fmt"
)
func Greet(){
fmt.Println("Greet Call Hi")
hi.Hi()
}
hi.go
package hi
import "fmt"
func Hi(){
fmt.Println("Hi")
}
hello.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
方法可以很好地工作)
请提供帮助或尝试提供一些解决此问题的想法。提前致谢。