直接使用二进制包

时间:2015-02-09 09:08:36

标签: go

我在Go中编写了一个库。我计划分发它,主要要求是没有源代码'。

为了测试,我创建了两个工作区,如下面的

WS1

  • 仓/
  • PKG / linux_amd64 / lib.a
  • src / lib / src.go

WS2

  • 仓/
  • PKG /
  • 的src /主/ main.go

我的第一个工作区(WS1)是实际的虚拟库,它具有一些实用功能。第二个工作区(WS2)具有main函数,它使用WS1中的包(lib.a)。

在从WS1中删除源代码之前,一切正常。如果我在WS1中删除目录/lib/src.go,我在go build期间遇到以下错误,

  

main.go:5:2:找不到包" lib"在任何一个:   / usr / local / go / src / pkg / lib(来自$ GOROOT)../Testing/ws1/src/lib   (来自$ GOPATH)

以上消息表明我们应该保留源文件。 不能直接使用预编译的二进制包

基于网上的一些建议,我们可能会保留一些时间戳值小于二进制包的虚拟源。时间戳。但是,对我们来说,这似乎不是一个可行的解决方案。如果虚拟源的时间戳不幸被更新会发生什么?

我在这里讨论过类似的问题, https://github.com/golang/go/issues/2775

我的问题:

  1. 在Golang中分发源是唯一的可能性吗?

  2. 为什么Go没有提供使用' .a'文件直接?

  3. 如果保持Go的强制来源,那么为什么这么小呢 Go中没有提到过? (或)我在这里遗漏了什么吗?

  4. 提前感谢您的帮助!

3 个答案:

答案 0 :(得分:12)

Go编译器只需要.a个文件。如果您发货,任何人都可以在没有源代码的情况下使用您的包裹。

您的用户必须手动调用编译器(例如6g,而不是go工具)。如果您发送的myfoo.a文件只包含myfoo.go的虚拟来源package myfoo,则myfoo.a的时间戳比{{1}的时间戳更新(并且你把所有东西放在适当的位置)你可以使用myfoo.go工具。

更新:更新版本的go工具检测已删除的文件,并要求所有文件(可能为空)在src文件夹中包含正确的文件名和较旧的时间戳。 管理时间戳不应该是一个交易破坏者。

不要误以为go工具 Go:这是一个用来构建,测试,获取任何Go代码的方便工具,但它既不是语言也不是编译器或链接器。

顺便说一句:没有分发来源是没有意义的。

答案 1 :(得分:6)

仅二进制包将在go1.7(2016年8月) - https://tip.golang.org/doc/go1.7

中提供
  

此版本增加了对使用仅二进制包构建程序的实验性最小支持,这些包以二进制形式分发,没有相应的源代码。某些商业环境中需要此功能,但无法完全集成到工具链的其余部分。例如,假定访问完整源代码的工具不适用于此类软件包,并且没有计划在“go get”命令中支持此类软件包。

提案位于https://github.com/golang/proposal/blob/master/design/2775-binary-only-packages.mdhttps://tip.golang.org/pkg/go/build/#hdr-Binary_Only_Packages提供了有关新功能的更多信息。

答案 2 :(得分:0)