为什么很多golang项目直接从GitHub导入?

gac*_*opu 4 github go

我对 golang 完全陌生,我想知道为什么许多 golang 项目在他们的源代码中这样写:

import  "github.com/stretchr/testify/assert"
Run Code Online (Sandbox Code Playgroud)

如果这testify转移到 bitbucket 怎么办?

为什么import testify不像其他语言一样下载 testify 和?

nov*_*ung 5

在我回答您的问题之前,您需要了解 golang 管理其包和依赖项的方式。


要下载软件包,请使用该go get命令。用法示例:

$ go get github.com/stretchr/testify
Run Code Online (Sandbox Code Playgroud)

上面的命令将下载 testify 包,然后将其存储在本地工作空间下,其结构遵循其 url(TL;DR工作空间路径注册为$GOPATHenv 变量)。

$GOPATH/src/github.com/stretchr/testify
Run Code Online (Sandbox Code Playgroud)

来自文档的解释为什么下载的包名称将跟随它的 url:

Get 下载由导入路径命名的包及其依赖项。


现在关于你的问题:

为什么很多golang项目直接从GitHub导入?

该声明import "github.com/stretchr/testify/assert" 并不意味着该包是直接从 github 网站(通过 http)导入的。它是从当地进口的,从github.com/stretchr/testify下路$GOPATH/src。该软件包之前已下载并存储在那里,因此可以将其导入任何项目。

以下是有关导入语句的文档的说明:

Go 路径 ( $GOPATH) 用于解析导入语句。

也看看下面的一些代码(取自我的本地)。

$ echo $GOPATH
/Users/novalagung/Documents/go

$ go get -u github.com/stretchr/testify
# package will be downloaded into $GOPATH/src folder using the same structure as the github url

$ tree -L 1 $GOPATH/src/github.com/stretchr/testify
/Users/novalagung/Documents/go/src/github.com/stretchr/testify
??? Gopkg.lock
??? Gopkg.toml
??? LICENSE
??? README.md
??? _codegen
??? assert
??? doc.go
??? http
??? mock
??? package_test.go
??? require
??? suite
??? vendor
Run Code Online (Sandbox Code Playgroud)

所以如果你想导入任何包,它必须在$GOPATH/src文件夹下。


如果这个作证转移到bitbucket怎么办?

它对您的本地项目没有影响,因为之前已经下载了所需的包。但是,如果您想更新它,您可能需要更改包路径以遵循它的新 url,可能像bitbucket.org/stretchr/testify/assert? 取决于新的 bitbucket url 的样子。

但我不认为作证的所有者会这样做,因为它会破坏很多人的代码。

  • 不过,“go get”将从 github 下载,因此您的答案的这一部分具有误导性。文件夹结构恰好与源代码的 URL 匹配,因为这是一个很好的做法 (2认同)
  • @gacopu 就像其他所有语言一样 - 您要么在代码中携带依赖项,要么祈祷原始存储库/工件保持在线 (2认同)