gpt4 book ai didi

go - 直接使用二进制包

转载 作者:IT老高 更新时间:2023-10-28 13:04:16 27 4
gpt4 key购买 nike

我正在用 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

我的问题:

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

  2. 为什么 Go 不提供直接使用“.a”文件的规定?

  3. 如果保留源代码对于 Go 来说是强制性的,为什么这个小东西是在 Go 的任何地方都没有提到? (或)我在这里遗漏了什么吗?

提前感谢你们的帮助!

最佳答案

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

但是您的用户必须手动调用编译器(例如 6g,而不是 go 工具)。如果您发送 myfoo.a 文件 一个仅包含 package myfoo 和时间戳的虚拟源 myfoo.go myfoo.a 的更新比 myfoo.go 的更新(并且您将所有内容都放在了适当的位置),您可以使用 go 工具。

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

不要误以为 go 工具 Go:它是一个非常方便的工具,可以构建、测试、获取任何 Go 代码,但它确实是既不是语言,也不是编译器,也不是链接器。

顺便说一句:不分发源代码真的没有意义。

关于go - 直接使用二进制包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28406122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com