目录不同时,go程序包路径如何工作?

时间:2018-11-28 04:48:37

标签: go

我正在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映射到我的本地目录在哪里?

2 个答案:

答案 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 buildgo installgo test等命令会自动将所有其他必需的软件包下载到$HOME/go/pkg/mod,除非指定了-mod=vendor标志,在这种情况下,将使用vendor中的源。

答案 1 :(得分:0)

Golang具有内部机制来解析导入路径。

此机制依赖于计算机,GOROOT,GOPATH和旧版本GO15VENDOREXPERIMENT中是否存在几个变量。

当编译器遇到包路径时,它将使用这些路径进行查找

  • GOROOT / src / [导入路径]
  • GOPATH / src / [导入路径]
  • cwd / vendor / [导入路径]

最长的路径获胜,并被选择进行进一步处理。

GOROOT是stdlib的路径。 GOPATH是您本地工作空间的路径。

有关所有详细信息,https://go.googlesource.com/proposal/+/master/design/25719-go15vendor.md

这一切都取决于计算机的设置,因此请仔细检查go env的输出。