直接使用二进制包
Using binary packages directly
我正在用 Go 编写一个库。我打算分发它,主要要求是“无源代码”。
为了测试,我创建了两个工作区,如下所示,
WS1
- bin/
- pkg/linux_amd64/lib.a
- src/lib/src.go
WS2
- bin/
- 包装/
- src/main/main.go
我的第一个工作区 (WS1) 是实际的虚拟库,它有一些实用函数。第二个工作区 (WS2) 具有使用 WS1 中的包 (lib.a) 的主要功能。
一切正常,直到我从 WS1 中删除源。如果我在 WS1 中删除目录 /lib/src.go,我会在 go build 期间收到以下错误,
main.go:5:2: cannot find package "lib" in any of:
/usr/local/go/src/pkg/lib (from $GOROOT) ../Testing/ws1/src/lib
(from $GOPATH)
以上信息告诉我们,我们也应该保留源文件。 单独预编译二进制包不能直接使用.
根据网上的一些建议,我们可能会保留一些时间戳值小于二进制包时间戳的虚拟源。但是,这对我们来说似乎不是一个可行的解决方案。如果不幸更新了虚拟源的时间戳会怎样?
我看到这里讨论过类似的问题,
https://github.com/golang/go/issues/2775
我的问题:
分发源代码是 Golang 中唯一的可能吗?
为什么 Go 不提供直接使用 '.a' 文件的规定?
如果保留源代码对于 Go 来说是强制性的,为什么这个小东西是
在 Go 的任何地方都没有提到? (或)我在这里遗漏了什么吗?
在此先感谢您的帮助!
Go 编译器只需要 .a
个文件。如果您运送它们,任何人都可以在没有源代码的情况下使用您的包裹。
BUT 您的用户将不得不手动调用编译器(例如 6g
,而不是 go
工具)。如果你发送一个 myfoo.a
文件 和 一个只包含 package myfoo
的虚拟源 myfoo.go
并且 myfoo.a
的时间戳比myfoo.go
(你把所有东西都准备好了)你可以使用 go
工具。
更新:较新版本的 go 工具检测已删除的文件,并要求 src 文件夹中的所有文件(可能为空)具有正确的文件名和较旧的时间戳。
管理时间戳不应该成为交易破坏者。
不要被 go
工具 是 Go 所愚弄:它是一个非常方便的工具,可以构建、测试、获取,无论您的 Go 代码是什么,但是它既不是语言,也不是编译器,也不是链接器。
顺便说一句:不分发资源真的没有意义。
仅二进制包将在 go1.7(2016 年 8 月)中可用 - https://tip.golang.org/doc/go1.7
This release adds experimental, minimal support for building programs using binary-only packages, packages distributed in binary form without the corresponding source code. This feature is needed in some commercial settings but is not intended to be fully integrated into the rest of the toolchain. For example, tools that assume access to complete source code will not work with such packages, and there are no plans to support such packages in the “go get” command.
提案在 https://github.com/golang/proposal/blob/master/design/2775-binary-only-packages.md , https://tip.golang.org/pkg/go/build/#hdr-Binary_Only_Packages 有更多关于新功能的信息。
go 1.7 现在支持二进制包。
现在只能提供没有源代码的.a文件和伪造的go文件来分发。
这是一个detailed example and a script of Go1.7 binary package generator.
myframework/frameImplement.go
package myframework
import "fmt"
func Hello(name string) string {
return fmt.Sprintf("Hello, %s!", name)
}
main/main.go
package main
import (
"fmt"
"golang-binary-package-generator/myframework"
)
func main() {
fmt.Println(" start program ")
fmt.Println(" print program :", myframework.Hello("print something now"))
}
如果我想隐藏我的框架的源代码,只需使用 go build -i -o $GOPATH/pkg/framework.a
构建它,然后将您的源代码修改为
//go:binary-only-package
package framework
//you can add function prototype here for go doc etc, but no necessary.
,你可以使用我的二进制包生成器(脚本)来帮助你。
放弃功能的决定:
我正在用 Go 编写一个库。我打算分发它,主要要求是“无源代码”。
为了测试,我创建了两个工作区,如下所示,
WS1
- bin/
- pkg/linux_amd64/lib.a
- src/lib/src.go
WS2
- bin/
- 包装/
- src/main/main.go
我的第一个工作区 (WS1) 是实际的虚拟库,它有一些实用函数。第二个工作区 (WS2) 具有使用 WS1 中的包 (lib.a) 的主要功能。
一切正常,直到我从 WS1 中删除源。如果我在 WS1 中删除目录 /lib/src.go,我会在 go build 期间收到以下错误,
main.go:5:2: cannot find package "lib" in any of: /usr/local/go/src/pkg/lib (from $GOROOT) ../Testing/ws1/src/lib (from $GOPATH)
以上信息告诉我们,我们也应该保留源文件。 单独预编译二进制包不能直接使用.
根据网上的一些建议,我们可能会保留一些时间戳值小于二进制包时间戳的虚拟源。但是,这对我们来说似乎不是一个可行的解决方案。如果不幸更新了虚拟源的时间戳会怎样?
我看到这里讨论过类似的问题, https://github.com/golang/go/issues/2775
我的问题:
分发源代码是 Golang 中唯一的可能吗?
为什么 Go 不提供直接使用 '.a' 文件的规定?
如果保留源代码对于 Go 来说是强制性的,为什么这个小东西是 在 Go 的任何地方都没有提到? (或)我在这里遗漏了什么吗?
在此先感谢您的帮助!
Go 编译器只需要 .a
个文件。如果您运送它们,任何人都可以在没有源代码的情况下使用您的包裹。
BUT 您的用户将不得不手动调用编译器(例如 6g
,而不是 go
工具)。如果你发送一个 myfoo.a
文件 和 一个只包含 package myfoo
的虚拟源 myfoo.go
并且 myfoo.a
的时间戳比myfoo.go
(你把所有东西都准备好了)你可以使用 go
工具。
更新:较新版本的 go 工具检测已删除的文件,并要求 src 文件夹中的所有文件(可能为空)具有正确的文件名和较旧的时间戳。 管理时间戳不应该成为交易破坏者。
不要被 go
工具 是 Go 所愚弄:它是一个非常方便的工具,可以构建、测试、获取,无论您的 Go 代码是什么,但是它既不是语言,也不是编译器,也不是链接器。
顺便说一句:不分发资源真的没有意义。
仅二进制包将在 go1.7(2016 年 8 月)中可用 - https://tip.golang.org/doc/go1.7
This release adds experimental, minimal support for building programs using binary-only packages, packages distributed in binary form without the corresponding source code. This feature is needed in some commercial settings but is not intended to be fully integrated into the rest of the toolchain. For example, tools that assume access to complete source code will not work with such packages, and there are no plans to support such packages in the “go get” command.
提案在 https://github.com/golang/proposal/blob/master/design/2775-binary-only-packages.md , https://tip.golang.org/pkg/go/build/#hdr-Binary_Only_Packages 有更多关于新功能的信息。
go 1.7 现在支持二进制包。
现在只能提供没有源代码的.a文件和伪造的go文件来分发。
这是一个detailed example and a script of Go1.7 binary package generator.
myframework/frameImplement.go
package myframework
import "fmt"
func Hello(name string) string {
return fmt.Sprintf("Hello, %s!", name)
}
main/main.go
package main
import (
"fmt"
"golang-binary-package-generator/myframework"
)
func main() {
fmt.Println(" start program ")
fmt.Println(" print program :", myframework.Hello("print something now"))
}
如果我想隐藏我的框架的源代码,只需使用 go build -i -o $GOPATH/pkg/framework.a
构建它,然后将您的源代码修改为
//go:binary-only-package
package framework
//you can add function prototype here for go doc etc, but no necessary.
,你可以使用我的二进制包生成器(脚本)来帮助你。
放弃功能的决定: