如何使用go get导入特定版本的软件包?

通过告诉npmpackage.json甚至直接从控制台直接安装那个版本的lib,从一个Node环境来我安装一个供应商lib的特定版本到工程文件夹( node_modules )中,就像这样:

 $ npm install express@4.0.0 

然后我用我的项目中的那个版本的包来导入:

 var express = require('express'); 

现在,我想要去做同样的事情。 我怎样才能做到这一点? 是否可以安装特定版本的软件包? 如果是这样,使用集中的$GOPATH ,我怎样才能导入一个版本,而不是另一个版本?

我会做这样的事情:

 $ go get github.com/wilk/uuid@0.0.1 $ go get github.com/wilk/uuid@0.0.2 

但是,在import过程中,我怎样才能有所作为呢?

真的很惊讶没有人提到gopkg.in 。

gopkg.in是一种提供封装(redirect)的服务,可让您将版本expression为回购url,而无需实际创build回购网站。 例如gopkg.in/yaml.v1 vs gopkg.in/yaml.v2,即使它们都在https://github.com/go-yaml/yaml

如果作者没有遵循适当的版本pipe理规范(通过在向后兼容性时增加版本号),但是这种方法不适用于分支和标签。

去获取是Go包pipe理器。 它以完全分散的方式工作,以及如果没有中央软件包托pipe存储库,软件包发现仍然是可能的。

除了查找和下载软件包之外,软件包pipe理器的另一个重要angular色是处理同一软件包的多个版本。 Go采取最简单实用的方法处理任何包pipe理器。 Go包没有多个版本。

总是从存储库中默认分支的HEAD中取出。 总是。 这有两个重要的含义:

  1. 作为一名软件包作者,您必须坚持稳定的HEAD理念。 您的默认分支必须始终是您的软件包的稳定版本。 您必须在function分支中进行工作,并在准备发布时才合并。

  2. 新软件包的主要版本必须有自己的存储库。 简而言之, 包的每个主要版本(遵循语义版本控制)都有自己的存储库,因此也有自己的导入path。

    例如github.com/jpoehls/gophermail-v1和github.com/jpoehls/gophermail-v2。

作为在Go中构build应用程序的人,上面的哲学确实没有什么坏处。 每个导入path都是一个稳定的API。 没有版本号需要担心。 真棒!

有关更多详情,请访问:http: //zduck.com/2014/go-and-package-versioning/

你可以使用git checkout来获得一个特定的版本,并使用这个版本来构build你的程序。

例:

 export GOPATH=~/ go get github.com/whateveruser/whateverrepo cd ~/src/github.com/whateveruser/whateverrepo git tag -l # supose tag v0.0.2 is correct version git checkout tags/v0.0.2 go run whateverpackage/main.go 

Glide是一个非常优雅的包pipe理,特别是如果你来自Node的npm或Rust的货物。

它在Godep 1.6的新供应商function中performance得非常好,但是更容易一些。 您的依赖和版本在您的projectdir / vendor目录中“locking”,而不依赖于GOPATH。

用brew(OS X)安装

 $ brew install glide 

初始化glide.yaml文件(类似于package.json)。 这也从GOPATH抓取项目中现有的导入包,然后复制到项目的供应商/目录。

 $ glide init 

获取新的软件包

 $ glide get vcs/namespace/package 

更新并locking包的版本。 这将在项目目录中创buildglide.lock文件来locking版本。

 $ glide up 

我试图滑行,并愉快地使用它为我目前的项目。

从Go 1.5开始,有一个“供应商实验”可以帮助您pipe理依赖关系。 从Go 1.6开始,这不再是一个实验。 Theres还有一些其他的select。 。

编辑:正如在这个答案中所提到的, gopkg.in是固定1.5之前的github-depdencies的一个很好的select。

我发现可行的方法是git的子模块系统 。 使用它你可以在给定版本的代码中进行子模块升级/降级是明确的和logging的 – 从来没有杂乱无章。

我采取的文件夹结构是:

 + myproject ++ src +++ myproject +++ github.com ++++ submoduled_project of some kind. 

dep是Go语言依赖pipe理的官方实验。 它需要Go 1.8或更新来编译。

要使用dep开始pipe理依赖关系,请从项目的根目录运行以下命令:

 dep init 

执行后将生成两个文件: Gopkg.toml (“manifest”), Gopkg.lock和必要的包将被下载到vendor目录中。

假设您有使用github.com/gorilla/websocket包的项目。 dep会生成以下文件:

Gopkg.toml

 # Gopkg.toml example # # Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md # for detailed Gopkg.toml documentation. # # required = ["github.com/user/thing/cmd/thing"] # ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] # # [[constraint]] # name = "github.com/user/project" # version = "1.0.0" # # [[constraint]] # name = "github.com/user/project2" # branch = "dev" # source = "github.com/myfork/project2" # # [[override]] # name = "github.com/x/y" # version = "2.4.0" [[constraint]] name = "github.com/gorilla/websocket" version = "1.2.0" 

Gopkg.lock

 # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. [[projects]] name = "github.com/gorilla/websocket" packages = ["."] revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" version = "v1.2.0" [solve-meta] analyzer-name = "dep" analyzer-version = 1 inputs-digest = "941e8dbe52e16e8a7dff4068b7ba53ae69a5748b29fbf2bcb5df3a063ac52261" solver-name = "gps-cdcl" solver-version = 1 

有帮助你更新/删除/ etc包的命令,请找官方github repo的dep (go的依赖pipe理工具)的更多信息。