【问题标题】:Why "go build" cannot find package?为什么“go build”找不到包?
【发布时间】:2012-06-26 09:21:27
【问题描述】:

我将test0 包安装到$gopath\pkg\windows_386\hello\test0.a,但是当我构建依赖于test0 包的主包时,编译器会显示:import "hello/test0": cannot find package

为什么会这样?

我有两个 go 文件:

$gopath/src/hello.go

package main

import (
    "fmt"
    "hello/test0"
)

func main() {
    fmt.Println(test0.Number)
}

$gopath/src/hello/test0/test0.go

package test0

const (
    Number int = 255
)

一开始,我运行go install hello/test0,它生成了$gopath\pkg\windows_386\hello\test0.a

然后,我删除目录$gopath/src/hello

最后,我运行go build hello.go,编译器显示hello.go:5:2: import "hello/test0": cannot find package

【问题讨论】:

  • go build 文档似乎并不暗示它可以在没有来源的情况下工作。你有类似构建逻辑的参考吗?
  • 谢谢。你能告诉我怎么做吗?
  • 对不起,我不知道如何在 Go1 中做到这一点(我只开源)。我什至不知道.a 是否包含所有需要的内容。但这是一个非常有趣的问题,我希望有人能够回答。如果没有,也许你应该问 golang-nuts。

标签: package go


【解决方案1】:

为什么要删除源? go 工具中的 build 命令用于构建包及其所有依赖项。为此,它会检查包的来源以查看它们是否因更改而需要构建。如果找不到它们,它会将它们视为未安装。

如果您真的只想处理二进制发行版,则需要直接使用编译器和链接器。您可以在此处找到相关文档:http://golang.org/cmd/

【讨论】:

    【解决方案2】:

    目前这似乎不太可能:https://code.google.com/p/go/issues/detail?id=2775

    也许适用于 Go1.1

    Dave 的一个技巧(我没有测试过):

    对于名为“hello”的包,go 工具将在其中查找 .go 源 $GOPATH/src/hello,并且仅当 .a 文件的时间戳为 在 .go 文件的最新时间戳之前。一个简单的方法来欺骗它 只接受 .a 文件就是在 更正 src 目录并将其时间戳设置为 .a 之前的时间戳 文件。

    (这是一个社区回答,使用what is said on golang-nuts)。

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2014-03-24
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多