我对golang完全陌生,我想知道,为什么许多golang项目都以这样的方式在源代码中编写:
import "github.com/stretchr/testify/assert"如果这个testify转移到bitbucket呢?
为什么不像其他语言一样,下载“作证”和import testify呢?
发布于 2018-10-19 02:07:15
在回答您的问题之前,您需要了解golang管理其包和依赖项的方式。
要下载软件包,请使用go get命令。用法示例:
$ go get github.com/stretchr/testify上面的命令将下载验证包,然后在工作空间下本地存储它,结构遵循url (TL;DR工作空间路径注册为$GOPATH env变量)。
$GOPATH/src/github.com/stretchr/testify医生的解释下载的包名为什么会跟随它的url:
下载由导入路径命名的包以及它们的依赖项。
关于你的问题:
为什么许多高丽项目直接从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因此,如果要导入任何包,则必须位于$GOPATH/src文件夹下。
如果这个证言被转移到bitbucket呢?
它对您的本地项目没有任何影响,因为所需的包之前已经下载过。但是,如果您想要更新它,您可能需要将包路径更改为它的新url,可能类似于bitbucket.org/stretchr/testify/assert?取决于新的bitbucket url是什么样子的。
但我不认为证人的主人会这么做,因为这会破坏很多人的密码。
发布于 2018-10-19 12:50:52
这个问题引起了对go中导入路径设计的良好关注。正如@xpare所提到的,go将依赖项带到本地$GOPATH。但“任择议定书”的问题尚未得到充分解决。
是的,如果github.com/stretchr/testify的作者/维护人员将包移动到bitbucket,那么这将导致问题。这可能不会对您的机器造成问题,因为您对计算机有依赖关系,但是它会给任何想要为应用程序贡献力量的人带来问题。不仅如此,如果每次构建服务器都必须提取依赖项,那么它也会给构建服务器带来问题。
尽管人们不会经常从github迁移到bitbucket,但事实证明,这仍然是一个值得关注的问题。当微软收购github时,许多软件包都转移到了其他供应商。不能保证任何供应商,github或其他公司,都会保持相同的价格,同样的服务质量,同样的功能等等,这是不可避免的事情会移动。
不仅如此,作者有时还会将包移动到不同用户下的github中的不同位置。这种事也会发生。
那这是个问题吗?是的,虽然go中导入urls的设计允许明确指定依赖项,但缺点是当包移动时,代码必须更改。如果您想要更新包,就会帮助应用程序抵抗这些更改,但是,如果您想要更新包,就不会有任何帮助。
go的设计需要一个分散的包管理。这种设计不受问题的影响,例如由于npm引起争议的删除kirk包导致许多npm应用程序中断。因此,如果人们不同意npm的理念,那将是一个大问题。但是,如果人们不喜欢github,他们通常会转移到其他提供者,包将始终在那里(在go中,这将导致源代码的更改)。因此,golang并不保证所有包名都是唯一的,因此需要完整的导入路径。
每一种方法都有其利弊。不幸的是,这意味着需要完整的导入路径。
发布于 2018-10-19 02:10:40
为什么不像其他语言一样下载指证和导入证言呢?
有些库会这样做(我的意思是,下载),因为Go没有正确的包管理,因此它使用了一种称为望存的技术,这基本上意味着从任何地方克隆/快照代码,并在导入语句中使用该包结构。
这种方法的缺点是,在重复该过程之前,您显然会丢失最新的更新,而且并不总是保证您签出的代码是一个稳定的版本。
https://stackoverflow.com/questions/52884836
复制相似问题