如何在go中导入本地包?

新手上路,请多包涵

我刚开始处理要本地化的示例代码。

在原来的 main.go 导入语句中是:

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

现在我有 commonrouters 包在 /home/me/go/src/myapp

所以我将导入语句转换为:

 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

Also, when I use common and routers instead of ./common and ./routers in the import statement, I get:

 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)

我怎样才能解决这个问题?

原文由 Karlom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

好吧,我想通了这个问题。基本上 Go 的导入起始路径是 $HOME/go/src

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

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

原文由 Karlom 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你使用的是 Go 1.5 以上版本,你可以尝试使用 vendoring 特性。它允许您将本地包放在 vendor 文件夹下,并使用较短的路径导入它。在您的情况下,您可以将 commonrouters 文件夹放在 vendor 文件夹中,这样就像

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

并像这样导入

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

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

仅供参考:您可以使用 vendor 做更多事情,因为此功能允许您将包的“所有依赖项代码”放入您自己的项目目录中,以便它始终能够为所有构建获得相同的依赖项版本。它就像 python 中的 npm 或 pip,但你需要手动将你的依赖项复制到你的项目中,或者如果你想让它变得简单,请尝试查看 Daniel Theophanes 的 govendor

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

理解和使用 Daniel Theophanes 的供应商文件夹

Lucas Fernandes da Costa 理解 Go 依赖管理

我希望你或其他人觉得它有帮助

原文由 arimaulana 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题