go - 解决 go 1.7 中 vendor 的 'cannot find package' 错误

标签 go

我的项目结构如下所示:-

session-service
    _libs   //Contains all the external dependencies
    api
    constants
    exceptions
    idgen
    jsonDecoder
    log
    model
    monitor
    persistence
    redis
    routes
    src/bddtest/servicetest
    util

_libs 的内容如下所示:-

github.com 
golang.org 
    x
        net
gopkg.in

我的 Makefile 如下所示:-

.PHONY: deploy

LOGLEVEL ?= 1
CONFIGFILE ?= 2
GOFLAGS ?= $(GOFLAGS:)

PWD = $(shell pwd)
export GOPATH = $(shell echo $$GOPATH):$(PWD)/_libs:$(PWD)
export GOBIN = $(PWD)/bin
export GOROOT = $(shell echo $$GOROOT)

deploy: clean build install 

build:
    @rm -rf pkg/ 2>/dev/null
    @rm -rf _libs/pkg/ 2>/dev/null
    @go build $(GOFLAGS) ./...

install:
    @go install ./...

clean:
    @go clean $(GOFLAGS) -i ./...


## EOF

一切正常。现在我正在考虑转向 vendor。所以我将我的 _libs 重命名为 vendor 并修改了我的 Makefile 如下:-

export GOPATH = $(shell echo $$GOPATH):$(PWD)

但在此之后我开始收到以下错误:-

vendor/golang.org/x/net/html/charset/charset.go:20:2: cannot find package "golang.org/x/text/encoding" in any of:
        /Users/debraj/golang/src/b/m/session-service/vendor/golang.org/x/text/encoding (vendor tree)
        /usr/local/go/src/golang.org/x/text/encoding (from $GOROOT)
        /Users/debraj/golang/src/golang.org/x/text/encoding (from $GOPATH)
        /Users/debraj/golang/src/b/m/session-service/src/golang.org/x/text/encoding
    vendor/golang.org/x/net/html/charset/charset.go:21:2: cannot find package "golang.org/x/text/encoding/charmap" in any of:
        /Users/debraj/golang/src/b/m/session-service/vendor/golang.org/x/text/encoding/charmap (vendor tree)
        /usr/local/go/src/golang.org/x/text/encoding/charmap (from $GOROOT)
        /Users/debraj/golang/src/golang.org/x/text/encoding/charmap (from $GOPATH)
        /Users/debraj/golang/src/b/m/session-service/src/golang.org/x/text/encoding/charmap
    vendor/golang.org/x/net/html/charset/charset.go:22:2: cannot find package "golang.org/x/text/encoding/htmlindex" in any of:
        /Users/debraj/golang/src/b/m/session-service/vendor/golang.org/x/text/encoding/htmlindex (vendor tree)
        /usr/local/go/src/golang.org/x/text/encoding/htmlindex (from $GOROOT)
        /Users/debraj/golang/src/golang.org/x/text/encoding/htmlindex (from $GOPATH)
        /Users/debraj/golang/src/b/m/session-service/src/golang.org/x/text/encoding/htmlindex
    vendor/golang.org/x/net/html/charset/charset.go:23:2: cannot find package "golang.org/x/text/transform" in any of:
        /Users/debraj/golang/src/b/m/session-service/vendor/golang.org/x/text/transform (vendor tree)
        /usr/local/go/src/golang.org/x/text/transform (from $GOROOT)
        /Users/debraj/golang/src/golang.org/x/text/transform (from $GOPATH)
        /Users/debraj/golang/src/b/m/session-service/src/golang.org/x/text/transform
    vendor/golang.org/x/net/http2/h2i/h2i.go:38:2: cannot find package "golang.org/x/crypto/ssh/terminal" in any of:
        /Users/debraj/golang/src/b/m/session-service/vendor/golang.org/x/crypto/ssh/terminal (vendor tree)
        /usr/local/go/src/golang.org/x/crypto/ssh/terminal (from $GOROOT)
        /Users/debraj/golang/src/golang.org/x/crypto/ssh/terminal (from $GOPATH)
        /Users/debraj/golang/src/b/m/session-service/src/golang.org/x/crypto/ssh/terminal

环境:-

  • go版本go1.7.3 darwin/amd64
  • Mac OS X 10.11.6

有人可以告诉我为什么我在使用 vendor 时会出现上述错误,但在使用 _libs 时一切正常吗?

更新

在我的本地,$(go list ./... | grep -v/vendor/) 输出中的换行符导致了一些问题。所以为了解决这个问题,我不得不稍微修改一下 jimb 的解决方案。我在 Makefile PKG = $(shell go list ./... | grep -v/vendor/| tr "\n""") 中引入了一个变量,然后在 go installgo build 中使用该变量,例如 @go build $(GOFLAGS) $(PKG)

最佳答案

_libs目录以_开头,被go工具忽略。当您将包移动到 vendor/ 时,./... 通配符现在包括 vendor 目录中的所有包。

您应该明确列出要安装的包,而不是依赖于 ./... 通配符。如果您仍然想要通配符行为,您可以使用 go list ./... 并过滤路径中包含 vendor/ 目录的任何包。根据您的具体需求,这可能很简单:

go install $(go list ./... | grep -v vendor/)

关于go - 解决 go 1.7 中 vendor 的 'cannot find package' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41589384/

相关文章:

go - 如何在 gorm 中处理多个查询

Go-lang并行段运行速度比串行段慢

Golang 接口(interface)的好处

go - 使用Go从Firestore获取单个文档的惯用方式是什么?

go - Go Web 服务器在哪里查找文件

go - 可以让 channel 保持打开状态吗?

go - Gos是否有MarshalURLQuery的实现?

Go:将 unsafe.Pointer 转换为函数指针,反之亦然

go - 我的 Golang 应用程序中是否需要一个或多个 sarama.SyncProducer?

mysql - 如何处理 sql.ErrTxDone