如何使用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从存储库中默认分支的头部提取。总是。这有两个重要影响:

  • 作为一名软件包作者,你必须坚持稳重的头脑哲学。默认分支必须始终是包的稳定、发布版本。您必须在功能分支中执行工作,并且只有在准备发布时才进行合并

  • 软件包的新主要版本必须有自己的存储库。简单地说,包的每个主要版本(遵循语义版本控制)都有自己的存储库,因此也有自己的导入路径

    e、 g.github.com/jpoehls/gophermail-v1和github.com/jpoehls/gophermail-v2


  • 对于在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
    vs
    gopkg.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