李恒道 发表于 2023-8-13 16:24:49

go get命令变化与远程库获取规则

在Go1.17之前使用go get命令会自动下载依赖并编译,文件在gopath目录的bin目录中
Go1.17以后不再编译文件,只是单纯的依赖下载

并且在1.17版本之前
如果main文件不在项目主目录,类似在cmd目录中
如果输入 go get github.com/org/project/cmd
会自动拉取,并进入cmd中编译文件

因为远程包的格式是      网站域名/作者/项目名
当输入相对路径的时候拉取项目会自动忽略,直接拉取github.com/org/project
然后进入到cmd目录中编译main.go

> go get命令会将代码包远程导入路径与预置的代码托管站点的主域名进行匹配。如果匹配成功,则在对代码包远程导入路径的初步检查后返回正常的返回值或错误信息。

# 对于非预置代码托管站点
对于托管在其他服务器上的代码,导入路径可以使用版本控制系统,或者 go 工具可以通过 https/http 动态获取导入路径,并从 HTML 中的 meta标记发现代码所在的位置。

使用哪种版本控制系统取决于携带的后缀,如baz,git,svn,hg等

当版本控制系统支持多种协议时,每个协议都会依次尝试下载。 例如,Git 下载会尝试使用 git://、https://、http://。

如果导入路径不是已知的代码托管站点并且也缺少版本控制系统的限定符,go 工具尝试通过 https/http 获取导入并查找文档的 HTML head中的meta标记。

元标记的格式如下:

```html
<meta name="go-import" content="import-prefix vcs repo-root">
```

例如 import "example.org/pkg/foo"
将会导致下列请求
         https://example.org/pkg/foo?go-get=1 (首选)
         http://example.org/pkg/foo?go-get=1(后备)
得到了页面的meta
```html
<meta name="go-import" content="example.org git https://code.org/r/p/exproj">
```
go工具将验证是否ttps://example.org/?go-get=1包含同样的meta
然后调用git clone https://code.org/r/p/exproj 放入 GOPATH/src/example.org.
# 参考文章

https://polarisxu.studygolang.com/posts/go/dynamic/1.17-golang-go-get-updated/
https://doc.yonyoucloud.com/doc/wiki/project/go-command-tutorial/0.3.html
http://c.biancheng.net/view/123.html
https://pkg.go.dev/github.com/changkun/go-under-the-hood/gosrc/cmd/go
页: [1]
查看完整版本: go get命令变化与远程库获取规则