go get을 사용하여 특정 버전의 패키지를 가져 오려면 어떻게해야합니까?


109

Node특정 버전의 공급 업체 lib를 프로젝트 폴더 ( node_modules)에 설치하는 데 사용 했던 환경 에서 다음과 같이 npm해당 lib의 해당 버전을 package.json콘솔에서 또는 콘솔에서 직접 설치하도록 지시합니다 .

$ 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

하지만 가져 오는 동안 어떻게 차이를 만들 수 있습니까?


4
당신은 할 수행 go get이 동작을하려면 올바른 도구가 아닙니다. 특정 문제에 대한 해결책을 찾아 볼 수 있습니다.
Wessie 2014-07-20

1
읽기
kostix


Go 1.11 이상의 경우 Go 모듈 : stackoverflow.com/questions/53682247/…
Everton

답변:


46

Go 1.11에는 go 모듈이라는 기능이 있으며 버전에 종속성을 추가하기 만하면됩니다. 다음과 같이하세요:

go mod init .
go mod edit -require github.com/wilk/uuid@0.0.1` 
go get -v -t ./...   
go build
go install 

해당 주제에 대한 자세한 정보는 다음과 같습니다. https://github.com/golang/go/wiki/Modules


4
go get으로 어떻게하나요? 특정 버전에 글로벌 go 바이너리를 설치해야했습니다
James Tan

7
@JamesTan go get github.com/wilk/uuid@0.0.1(with GO111MODULE=on)
Neil Conway

5
문제는 사용하던 go get,하지 go mod.
Bernardo Loureiro

40

아무도 gopkg.in 을 언급하지 않았다는 사실에 놀랐습니다 .

gopkg.in실제로 저장소를 만들지 않고도 버전을 저장소 URL로 표현할 수있는 래퍼 (리디렉션)를 제공하는 서비스입니다. 예 gopkg.in/yaml.v1gopkg.in/yaml.v2, 심지어 모두 라이브 그들은 비록https://github.com/go-yaml/yaml

저자가 적절한 버전 관리 관행을 따르지 않는 경우 (이전 버전과의 호환성을 깨뜨릴 때 버전 번호를 늘림) 완벽하지 않지만 브랜치 및 태그와 함께 작동합니다.


5
gopkg를 좋아하고 사용하지만 버전 관리 하위 패키지에서 제대로 작동하지 않습니다 . 알아 두어야 할 것입니다.
Alec Thomas

gopkg.in은 git 이전 버전에서 완전히 테스트되지 않았으므로 git <v1.9
BMW

또한 주요 버전에서만 작동합니다. 재현 가능한 빌드를 보장하는 것은 사용할 수 없습니다.
CAFxX

26

을 사용 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

해결책은 git checkout 후 설치하는 것입니다
ptman

@ aliaksei-maniuk는 더 나은 솔루션을 제공합니다. https://github.com/golang/dep
João Paraná 2017

15

Glide 는 특히 Node의 npm 또는 Rust의화물에서 온 경우 Go를위한 정말 우아한 패키지 관리입니다.

1.6에서 Godep의 새로운 공급 업체 기능과 밀접하게 작동하지만 훨씬 더 쉽습니다. 종속성 및 버전은 GOPATH에 의존하지 않고 projectdir / vendor 디렉터리 내에 "잠 깁니다".

Brew로 설치 (OS X)

$ brew install glide

glide.yaml 파일을 초기화합니다 (package.json과 유사). 또한 GOPATH에서 프로젝트의 기존 가져온 패키지를 가져 와서 프로젝트의 vendor / 디렉토리에 복사합니다.

$ glide init

새 패키지 받기

$ glide get vcs/namespace/package

패키지 버전을 업데이트하고 잠급니다. 그러면 프로젝트 디렉토리에 glide.lock 파일이 생성되어 버전을 잠급니다.

$ glide up

글라이드를 시도했고 현재 프로젝트에서 즐겁게 사용하고 있습니다.


1
: 완성도를 들어, 다음은 글라이드를위한 웹 사이트입니다 glide.sh : 그리고 여기 REPO github.com/Masterminds/glide
마이클 Franzl

불행히도 Glide는 더 이상 "활성"상태가 아닙니다. github 페이지에서 공식 패키지 관리로 마이그레이션 할 것을 제안합니다 (이제 모듈로 이동)
damoiser

13

업데이트 18-11-23 : Go 1.11 모드에서 공식 실험입니다. @krish 답변을 참조하십시오.
19-01-01 업데이트 : Go 1.12 모드는 여전히 공식 실험입니다. Go 1.13부터는 모듈 모드가 모든 개발의 기본값이됩니다.
업데이트 19-10-17 : Go 1.13 mod는 공식 패키지 관리자입니다.

https://blog.golang.org/using-go-modules

이전 답변 :

당신은 offical 한으로 버전을 설정할 수 있습니다 출발

dep ensure --add github.com/gorilla/websocket@1.2.0

3
문제는 사용하던 go get,하지 dep.
Bernardo Loureiro


9

depGo 언어의 종속성 관리를위한 공식 실험입니다. 컴파일하려면 Go 1.8 이상이 필요합니다.

를 사용하여 종속성 관리를 시작하려면 dep프로젝트의 루트 디렉터리에서 다음 명령어를 실행하세요.

dep init

실행 후 두 개의 파일 Gopkg.toml( "manifest") 이 생성 Gopkg.lock되고 필요한 패키지가 vendor디렉토리 로 다운로드됩니다 .

github.com/gorilla/websocketpackage 를 사용하는 프로젝트가 있다고 가정 해 보겠습니다 . 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

패키지를 업데이트 / 삭제 / 삭제하는 데 도움이되는 명령이 있습니다 . (Go 용 종속성 관리 도구) 의 공식 github 저장소 에서 자세한 정보를 찾으십시오 dep.


7

요즘에는 그냥 사용할 수 있습니다 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.mod의 Go 모듈 종속성을 repo의 최신 커밋으로 지정하는 방법은 무엇입니까?

Go get문서에 나와있는 것처럼 바이너리 도 설치 합니다.

Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.

( https://golang.org/cmd/go/에서 )


4

go get 은 Go 패키지 관리자입니다. 완전히 분산 된 방식으로 작동하며 중앙 패키지 호스팅 저장소 없이도 패키지 검색이 여전히 가능합니다.

패키지를 찾고 다운로드하는 것 외에도 패키지 관리자의 또 다른 큰 역할은 동일한 패키지의 여러 버전을 처리하는 것입니다. Go는 패키지 관리자 중 가장 최소한의 실용적인 접근 방식을 취합니다. Go 패키지의 여러 버전과 같은 것은 없습니다.

go get은 항상 저장소에있는 기본 브랜치의 HEAD에서 가져옵니다. 항상. 여기에는 두 가지 중요한 의미가 있습니다.

  1. 패키지 작성자는 안정적인 HEAD 철학을 준수해야합니다. 기본 브랜치는 항상 패키지의 안정적인 릴리스 버전이어야합니다. 기능 브랜치에서 작업하고 릴리스 할 준비가 된 경우에만 병합해야합니다.

  2. 패키지의 새 주요 버전에는 자체 저장소가 있어야합니다. 간단히 말해, 패키지의 각 주요 버전 (시맨틱 버전 관리를 따름)은 자체 리포지토리와 자체 가져 오기 경로를 갖습니다.

    예 : github.com/jpoehls/gophermail-v1 및 github.com/jpoehls/gophermail-v2.

Go에서 애플리케이션을 구축하는 사람으로서 위의 철학에는 실제로 단점이 없습니다. 모든 가져 오기 경로는 안정적인 API입니다. 걱정할 버전 번호가 없습니다. 대박!

자세한 내용은 http://zduck.com/2014/go-and-package-versioning/


45
go 도구의 기능에 대한 귀하의 진술은 정확하지만 거의 아무도 버전을 git 저장소 이름에 통합하지 않으며 많은 사람들이 master / HEAD를 안정적인 API로 취급하지 않습니다. 현재 약 8 개의 종속성이있는 작은 서비스가 있습니다. 하나만 버전 번호가 있습니다. Amazon은 github.com/aws/aws-sdk-go에 주요 변경 사항을 푸시했습니다. go get의 캐싱은 매번 최신 버전으로 업데이트하는 데 도움이되는 빌드 서버가없는 한 잠시 동안 눈치 채지 못함을 의미합니다. 타사 패키지 관리자가 있지만 대부분은 신중합니다.
dhasenan 15.11.03

19
@faisal_kk 당신은 꿈의 세계에 살고 있어야합니다. 멋진 오픈 소스 커뮤니티의 실제 세계에서 모든 사람은 자신의 철학을 고수하고 있습니다. 분기 릴리스 같은 것은 없습니다. 태그가있어 기쁩니다.

28
모든 버전에 대한 저장소를 만드시겠습니까? 미친 짓입니다
deFreitas

8
이것은 근본적으로 잘못된 행동입니다. 소스 코드는 릴리스 된 패키지와 동일하지 않으며, 이전 버전과의 호환성을 보장하기 위해 패키지 작성자를 지정할 수 없습니다. 개발자가 무능하기 때문이 아니라 패키지 종속성 수가 하나 이상으로 증가하면 이론적으로 불가능하기 때문입니다. 따라서 Go get은 주된 결함이 정확히 동일한 것이었던 bower와 동일한 방식으로 진행될 예정입니다. 시맨틱 버전 관리도 충분히 강력하지 않으며, 바이너리 체크섬이 실제로 유일한 방법입니다.
Gudlaugur Egilsson

5
"걱정할 버전 번호가 없습니다. 훌륭합니다!" 그것은 SO 대답에서 가장 어리석은 진술이어야합니다. 버전 관리에는 이유가 있습니다. Go에 내장 된 구성 또는 명령 지향 메커니즘이있는 패키지 관리자가 없다고해서 버전 관리가 성가신 것을 의미하지는 않습니다. 반대 투표!
Harindaka

2

내가 찾은 접근 방식은 git의 하위 모듈 시스템 입니다. 주어진 코드 버전에서 하위 모듈을 사용할 수 있으며 업그레이드 / 다운 그레이드는 명시적이고 기록됩니다. 절대 우연이 아닙니다.

이것으로 찍은 폴더 구조는 다음과 같습니다.

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

나도이 방법을 사용합니다. 기본적으로 go get과 동일한 폴더 구조를 따르지만 획득하는 버전을 더 잘 제어 할 수 있습니다.
Brad Peabody

기준에 질문에 대답하지 않는 대답은 (사용 요청 go get)
밥 티스트 밀레 - 마티아스


2

패키지의 현재 버전 위에 특정 커밋 (다른 분기 저장소에서도)을 추가 하는 go edit -replace 명령이 있습니다. 이 옵션의 멋진 점은 정확한 의사 버전을 미리 알 필요가없고 커밋 해시 ID 만 알 필요가 있다는 것입니다. 입니다.

예를 들어, "github.com/onsi/ginkgo v1.8.0"패키지의 안정적인 버전을 사용하고 있습니다.

이제 go.mod에서이 필수 패키지 줄을 수정하지 않고 은행 나무 버전 위에 내 포크의 패치를 추가하고 싶습니다.

$ GO111MODULE="on"  go mod edit -replace=github.com/onsi/ginkgo=github.com/manosnoam/ginkgo@d6423c2

모듈을 처음 빌드하거나 테스트 한 후 GO는 새 버전을 가져 와서 올바른 의사 버전으로 "바꾸기"줄을 생성합니다. 예를 들어 제 경우에는 go.mod 하단에 추가됩니다.

github.com/onsi/ginkgo => github.com/manosnoam/ginkgo v0.0.0-20190902135631-1995eead7451 교체


2

모듈 쿼리에 대한 약간의 치트 시트.

모든 기존 버전을 확인하려면 : 예 : go list -m -versions github.com/gorilla/mux

  1. 특정 버전 @ v1.2.8
  2. 특정 커밋 @ c783230
  3. 특정 커밋 @master
  4. 버전 접두사 @ v2
  5. 비교 @> = 2.1.5
  6. 최신 @latest

go get github.com/gorilla/mux@v1.7.4

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.