如何使用go get导入包的特定版本?
来自如何使用go get导入包的特定版本?,go,package,package-managers,Go,Package,Package Managers,来自节点环境,我曾告诉npm从package.json甚至直接从控制台安装供应商库的特定版本,从而将供应商库的特定版本安装到项目文件夹(Node\u modules)中,如下所示: $ npm install express@4.0.0 然后我在我的项目中导入该版本的软件包,只需使用: var express = require('express'); 现在,我想用go做同样的事情。我该怎么做? 是否可以安装软件包的特定版本?如果是这样,使用集中式的$GOPATH,如何导入一个版本而不是另一
节点
环境,我曾告诉npm
从package.json
甚至直接从控制台安装供应商库的特定版本,从而将供应商库的特定版本安装到项目文件夹(Node\u modules
)中,如下所示:
$ npm install express@4.0.0
然后我在我的项目中导入该版本的软件包,只需使用:
var express = require('express');
现在,我想用go
做同样的事情。我该怎么做?
是否可以安装软件包的特定版本?如果是这样,使用集中式的$GOPATH
,如何导入一个版本而不是另一个版本
我会这样做:
$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2
但是,在导入过程中,我如何才能发挥作用呢?go get是go软件包管理器。它以完全分散的方式工作,并且在没有中央包托管存储库的情况下,包发现仍然是可能的
除了定位和下载包外,包管理器的另一个重要角色是处理同一包的多个版本。Go采用任何包管理器中最简单、最实用的方法。没有Go软件包的多个版本
go get always从存储库中默认分支的头部提取。总是。这有两个重要影响:
对于在Go中构建应用程序的人来说,上述理念确实没有缺点。每个导入路径都是一个稳定的API。没有版本号可担心。太棒了
有关更多详细信息:我发现这种方法是可行的。使用它,您可以在给定版本的代码中创建子模块,并且升级/降级是显式的和有记录的,绝不是偶然的 我采用的文件夹结构是:
+ myproject
++ src
+++ myproject
+++ github.com
++++ submoduled_project of some kind.
从Go 1.5开始,有一个可以帮助您管理依赖关系的。从Go 1.6开始,这不再是一个实验。还有
编辑:如中所述,是固定github depdencies 1.5之前版本的一个好选项。您可以使用
git checkout
获取特定版本,并使用此版本构建程序
例如:
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
真奇怪没人提到
gopkg.in
是一种提供包装(重定向)的服务,它允许您将版本表示为repo URL,而无需实际创建repo。例如,gopkg.in/yaml.v1
vsgopkg.in/yaml.v2
,尽管他们都住在https://github.com/go-yaml/yaml
- gopkg.in/yaml.v1重定向到
- gopkg.in/yaml.v2重定向到
如果作者没有遵循正确的版本控制实践(在破坏向后兼容性时增加版本号),这并不完美,但它确实适用于分支和标记。Glide对于Go来说是一个非常优雅的包管理,特别是如果您来自Node的npm或Rust的货物 它的行为与Godep在1.6中的新供应商功能非常接近,但要简单得多。您的依赖项和版本在projectdir/vendor目录中被“锁定”,而不依赖于GOPATH 使用brew(OS X)安装 初始化glide.yaml文件(类似于package.json)。这还会从GOPATH获取项目中现有的导入包,然后复制到项目的供应商/目录
$ glide init
获取新包
$ glide get vcs/namespace/package
更新并锁定包的版本。这将在项目目录中创建glide.lock文件以锁定版本
$ glide up
我尝试了glide,并很高兴地将其用于我当前的项目 是Go语言依赖关系管理的官方实验。它需要Go 1.8或更新版本才能编译
要开始使用管理依赖项,请从项目的根目录运行以下命令:
dep init
执行后将生成两个文件:Gopkg.toml
(“清单”)、Gopkg.lock
,必要的软件包将下载到供应商
目录中
$ glide init
假设您有一个使用github.com/gorilla/websocket
包的项目。将生成以下文件:
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包,请查看更多关于
dep
(Go依赖管理工具)的信息。更新18-11-23:Go 1.11版是官方实验版。请参见@krish答案。更新19-01-01:从Go 1.12开始,mod仍然是官方实验。 从Go 1.13开始,模块模式将是所有开发的默认模式。
更新19-10-17:从Go 1.13开始,mod是官方软件包管理器 旧答案: 您可以通过office设置版本
Go1.11将有一个名为Go模块的功能,您可以简单地添加一个版本的依赖项。遵循以下步骤:
go mod init .
go mod edit -require github.com/wilk/uuid@0.0.1
go get -v -t ./...
go build
go install
这里有关于这个话题的更多信息-对我来说很有用
GO111MODULE=on-go-get-u github.com/segmentio/aws-okta@v0.22.1
如今,你只需使用go get
即可。您可以通过版本标记、分支甚至提交来获取依赖项
go get github.com/someone/some_module@master
go get github.com/someone/some_module@v1.1.0
go get github.com/someone/some_module@commit_hash
更多详情请参阅-
Go-get
还将安装二进制文件,如文档中所述-
Get下载由导入路径命名的包及其依赖项。然后安装命名的软件包,如“go insta”
go get github.com/someone/some_module@master
go get github.com/someone/some_module@v1.1.0
go get github.com/someone/some_module@commit_hash
$ GO111MODULE="on" go mod edit -replace=github.com/onsi/ginkgo=github.com/manosnoam/ginkgo@d6423c2