我是新手去处理我想要本地化的示例代码。
在原始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
此外,当我在导入语句中使用common
和routers
而不是./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)
我该如何解决这个问题?
答案 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)
一个例子:
在./greetings
,做go mod init example.com/greetings
从另一个模块,做go mod edit -replace=example.com/greetings=../greetings
go get example.com/greetings