【问题标题】:golang vendor path cannot find packagegolang供应商路径找不到包
【发布时间】:2019-02-25 05:23:23
【问题描述】:

我正在从github.com/tarm/serial 构建示例程序。

案例 1:如果上面的 repo 签出到$GOPATH/src/github.com/tarm/serial,它就可以构建。

案例 2:如果将 repo 移动到 $GOPATH/src/vendor/github.com/tarm/serial 下,go build 命令会报错 cannot find package "github.com/tarm/serial

案例 3:other SO answers 建议将其放在./vendor 下,以便包位于./vendor/github.com/tarm/serial。那也不行。

Go 版本是 1.10.4。我相信看到建议案例 2 或案例 3 的页面应该在过去的不同时间工作。有什么改变吗?您是否需要以某种方式启用供应商功能?

详情:

失败的命令

gotester:~/testdir$ go build uarttest_main.go
uarttest_main.go:5:9: cannot find package "github.com/tarm/serial" in any of:
    /home/gotester/bin/go/src/github.com/tarm/serial (from $GOROOT)
    /home/gotester/testdir/libs/src/github.com/tarm/serial (from $GOPATH)

源代码在./:

gotester:~/testdir$ cat uarttest_main.go
package main

import (
        "log"
        "github.com/tarm/serial"
)

func main() {
        c := &serial.Config{Name: "COM45", Baud: 115200}
        s, err := serial.OpenPort(c)
        if err != nil {
                log.Fatal(err)
        }

        n, err := s.Write([]byte("test"))
        if err != nil {
                log.Fatal(err)
        }

        buf := make([]byte, 128)
        n, err = s.Read(buf)
        if err != nil {
                log.Fatal(err)
        }
        log.Printf("%q", buf[:n])
}

./vendor 目录:

gotester:~/testdir$ tree --charset=ascii ./vendor
./vendor
`-- github.com
    `-- tarm
        `-- serial
            |-- basic_test.go
            |-- LICENSE
            |-- README.md
            |-- serial.go
            |-- serial_linux.go
            |-- serial_posix.go
            `-- serial_windows.go

3 directories, 7 files

如果现在运行这个命令:mv ./vendor/github.com ./libs/src,构建将成功。

【问题讨论】:

  • vendor 目录位于另一个项目的目录中,用于提供该项目的依赖项。将其签入GOPATH/src/vendor 没有任何意义。你到底想完成什么?
  • 我试图避免使用由go get 命令自动检出的包。我假设vendor 目录下的包需要单独签出,并且这些包通常被冻结到某个哈希值。
  • 如果testdir 是您项目的根,它需要位于GOPATH/src/testdir,而不是~/testdir。然后,如果您将依赖项签出到GOPATH/src/testdir/vendor,您将获得您正在寻找的行为。见Getting started
  • 解决方法:将当前工作目录移动到GOPATH/src/,问题解决。不仅可以使用./vendor,还可以使用当前目录的父目录中的任何vendor。我相信其他帖子表明,即使 ./vendor 不在 GOPATH/src 树中,它也应该可以工作,尽管在我的测试中由于某种原因这不是真的。
  • 隐含的意思是不要将 myproject 与第三方代码混合。最好将第三方代码放到lib/src 目录下,将myproject 放到lib/src 树之外的另一个地方。另一个SO 建议创建一个符号链接myproject -> ../..,这可能是更好的解决方案的另一种选择。我只是想知道......这将是一个更好的解决方案。

标签: go gopath govendor


【解决方案1】:

Go 工具链希望您的项目植根于GOPATH/src。如果testdir 是您项目的根,它需要位于GOPATH/src/testdir,而不是~/testdir。然后,如果您将依赖项签出到GOPATH/src/testdir/vendor,您将获得您正在寻找的行为。见Getting started

【讨论】:

  • 我知道建议将 GOPATH 设置为您的项目的顶层目录,该目录覆盖了树下的所有源代码。尽管可以将 GOPATH 设置为包含多个部分,每个部分都指向一个目录,但供应商功能确实依赖于仅将 GOPATH 设置为一个部分。这种理解正确吗?
  • 或者不同的解释:GOPATH 真的意味着多条路径中的第一部分。是吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 2019-09-09
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多