如何导入本地包?

时间:2016-02-18 11:47:32

标签: go

我是新手去处理我想要本地化的示例代码。

在原始main.go导入语句中,它是:

 import (
    "log"
    "net/http"
   "github.com/foo/bar/myapp/common"
    "github.com/foo/bar/myapp/routers"
)

现在我在common

中有routers/home/me/go/src/myapp个包裹

所以我将import语句转换为:

import (
    "log"
    "net/http"
    "./common"
    "./routers"
)

但是当我运行go install myapp时,我收到了以下错误:

can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package

此外,当我在导入语句中使用commonrouters而不是./common./routers时,我得到:

myapp/main.go:7:3: cannot find package "common" in any of:
    /usr/local/go/src/common (from $GOROOT)
    /home/me/go/src/common (from $GOPATH)
myapp/main.go:8:2: cannot find package "routers" in any of:
    /usr/local/go/src/routers (from $GOROOT)
    /home/me/go/src/routers (from $GOPATH)

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:28)

好吧,我弄明白了这个问题。 基本上,导入的起始路径为$HOME/go/src

所以我只需要在包名前添加myapp,即导入应该是:

import (
    "log"
    "net/http"
    "myapp/common"
    "myapp/routers"
)

答案 1 :(得分:13)

如果您使用的是上面的Go 1.5,则可以尝试使用 vendoring 功能。 它允许您将本地软件包放在供应商文件夹下,并使用较短的路径导入它。 在您的情况下,您可以将常用路由器文件夹放在供应商文件夹中 所以就像

myapp/
--vendor/
----common/
----routers/
------middleware/
--main.go

并像这样导入

import (
    "common"
    "routers"
    "routers/middleware"
)

这样可行,因为Go会尝试从您项目的供应商目录(如果它至少有一个.go文件)而不是$ GOPATH / src开始查找您的包。

仅供参考:您可以与供应商合作,因为此功能允许您将“所有依赖项代码”放在您自己项目目录中的包中,这样它就能够始终为所有构建获得相同的依赖项版本。它就像是python中的npm或pip,但你需要手动将你的依赖项复制到你的项目中,或者如果你想让它变得简单,试着看看Daniel Theophanes的govendor

有关此功能的更多信息,请尝试在此处查找

Understanding and Using Vendor Folder by Daniel Theophanes

Understanding Go Dependency Management by Lucas Fernandes da Costa

我希望你或其他人有所帮助

答案 2 :(得分:9)

导入路径与您的$GOPATH$GOROOT环境变量相关。例如,使用以下$GOPATH

GOPATH=/home/me/go

位于/home/me/go/src/lib/common/home/me/go/src/lib/routers的软件包分别导入为:

import (
    "lib/common"
    "lib/routers"
)

答案 3 :(得分:0)

本地软件包在go中是个烦人的问题。

对于我们公司的一些项目,我们决定不使用子包。 glide install go get/install一切正常。

对于某些项目,我们使用子包,并使用完整路径导入本地包:     import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage glide install go get/install一切正常。 但是如果我们分叉这个项目,那么子包仍然会引用原始项目。

答案 4 :(得分:0)

一个例子:

  1. ./greetings,做go mod init example.com/greetings

  2. 从另一个模块,做go mod edit -replace=example.com/greetings=../greetings

  3. go get example.com/greetings

来自go tutorial