我正在rclone项目上进行一些轻率的黑客攻击,而且还有些新手。我已将存储库克隆到主目录/home/poundifdef/rclone
中。
当我在顶级目录中查看文件rclone.go
时,会看到以下导入语句:
package main
import (
_ "github.com/ncw/rclone/backend/all"
"github.com/ncw/rclone/cmd"
_ "github.com/ncw/rclone/cmd/all"
)
我的问题是:据我所知,在这段代码中没有任何地方指定github.com/ncs/rclone/*
包应该引用这些目录的本地版本。我的文件系统中没有任何地方使用过名为github.com/ncw
的目录。但是,运行go run rclone.go
可以执行此代码。
给定的这些软件包不存在,路径github.com/ncw/rclone
映射到我的本地目录在哪里?
答案 0 :(得分:2)
github.com/ncw/rclone是module,因为它在存储库根目录中有一个file named go.mod
。由于您未设置$GOPATH
,因此启用了实验模块功能。
模块在文件系统中的放置位置无关。构造导入路径时,模块中的所有目录名称都会附加到模块名称之后。模块名称在go.mod
的第一行中定义,此处为“ github.com/ncw/rclone”。因此,./cmd
中的包具有导入路径github.com/ncw/rclone/cmd
。
go build
,go install
,go test
等命令会自动将所有其他必需的软件包下载到$HOME/go/pkg/mod
,除非指定了-mod=vendor
标志,在这种情况下,将使用vendor
中的源。
答案 1 :(得分:0)
Golang具有内部机制来解析导入路径。
此机制依赖于计算机,GOROOT,GOPATH和旧版本GO15VENDOREXPERIMENT中是否存在几个变量。
当编译器遇到包路径时,它将使用这些路径进行查找
最长的路径获胜,并被选择进行进一步处理。
GOROOT是stdlib的路径。 GOPATH是您本地工作空间的路径。
有关所有详细信息,https://go.googlesource.com/proposal/+/master/design/25719-go15vendor.md
这一切都取决于计算机的设置,因此请仔细检查go env
的输出。