go.mod의 Go 모듈 종속성을 repo의 최신 커밋으로 지정하는 방법은 무엇입니까?


111

v1.11 Go부터 모듈 지원이 추가되었습니다. 명령

go mod init <package name>
go build

생성하는 것입니다 go.modgo.sum패키지 의존성에 대한 발견 된 모든 버전을 포함하는 파일.

모듈에 릴리스가없는 경우 해당 모듈의 최신 커밋이 사용됩니다. 모듈에 릴리스가있는 경우 최신 릴리스가 종속성으로 선택됩니다.

그러나 때로는 아직 게시 된 릴리스에없는 기능이 필요하지만 해당 릴리스 이후에 만들어진 커밋에서 가져온 기능이 필요합니다. go.mod모듈 릴리스가 아니라 모듈 저장소의 특정 커밋을 가리 키도록 설정하는 방법은 무엇입니까?

go.mod에서 직접 할 수있는 것 같습니다.

module /my/module

require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)

v0.0.0마지막으로 게시 된 릴리스 태그와 일치하지 않는 위치 는 20181121201909커밋 타임 스탬프이며 af044c0995fe커밋 해시입니까? 그러한 정보를 직접 찾아서 입력해야합니까, 아니면 더 나은 방법이 있습니까?

답변:


171

원하는 커밋 해시에서 '가져 오기'만하면됩니다.

go get github.com/someone/some_module@af044c0995fe

'go get'은 종속성 파일 (go.mod, go.sum)을 올바르게 업데이트합니다.

추가 정보 : https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies


4
" 알 수없는 개정 "또는 " 유효하지 않은 버전 " 오류가 발생하는 경우 -PR (풀 요청)의 해시를 지정하지 않았는지 확인하십시오 . 병합 된 PR도 잘못 될 수 있습니다. 을 찾아는 환매 특약 아래에 해시를 저지 /commits하지만 아래 /pulls. 자세한 정보는 golang / go # 31191 에서 이러한 종류의 커밋을 명시 적으로 필터링합니다.
Noam Manos

1
영업 이익은 go.mod 파일에 추가하는 방법을 askes하는하지 말아야 할 방법go get
Nulik

2
@Nulik go getgo.modOP가 요청한 방식으로 업데이트 / 추가하는 올바른 방법 입니다.
Dave C

95

또한 특정 커밋을 얻기 위해 사용 하는 Everton 의 답변 외에도 다음 go get github.com/someone/some_module@af044c0995fe과 같은 브랜치 이름을 사용할 수 있습니다.

  • go get github.com/someone/some_module@master
  • go get github.com/someone/some_module@dev_branch

이러한 예제는 해당 분기에서 최신 커밋을 가져옵니다.

파일 에 .NET 과 같은 의사 버전 으로 계속 기록 go.mod됩니다 v0.0.0-20171006230638-a6e239ea1c69. (이는 표준 semver 주문을 기반으로 모든 버전에서 간단한 총 주문을 제공하는 데 도움이됩니다 .)


10
의사 버전 설명에 감사드립니다. 나는 replace일부 종속성의 임시 포크를 사용 하려고 시도 했지만 일부 커밋을 가리 키도록 대체하는 방법을 찾을 수 없습니다. 버전 태그를 만들고 이와 같이 지정해야 replace github.com/original/somelib => github.com/fork/somelib v1.2.3했는데, 빠르게 테스트하고 싶을 때 너무 많은 것입니다. replace github.com/original/somelib => github.com/fork/somelib@commithashreplace github.com/original/somelib => github.com/fork/somelib commithash작동하지 않습니다
Zhandos Zhylkaidar에게

8

나는 그것이 모든 사람을 위해 어떻게 작동하는지 얼마 동안 머리를 두 드렸고 나는 그것을 실행할 수 없습니다. 저에게는 마스터 브랜치에 전념해야했고 그때는 나만 얻을 수있었습니다.

go가 특정 브랜치, 커밋 ID 또는 태그로 작업하려면 아래 명령을 실행하여 go 모듈에 대한 플래그를 활성화해야합니다.

go env -w GO111MODULE = on

이 후 우리는 할 수 있습니다

go get repo@branchname
go get repo@tag
go get repo@commithash

3

일시적으로 로컬 디렉토리에 대한 종속성을 대체하려는 경우 (예 : 2 개의 모듈을 동시에 작업하는 경우) 파일 replace끝에 명령문을 추가 할 수 있습니다 go.mod.

module example.com/mypkg

go 1.15

require (
  gitlab.com/someone/a_package v0.14.2
)

replace gitlab.com/someone/a_package => ../my_forks/a_package

2

또한 go.mod 파일의 태그 대신 latest라는 단어를 넣으면 최신 태그 인 모듈로 변경됩니다.

예를 들면 :

module /my/module

require (
...
github.com/someone/some_module latest
...
)

될 것입니다

module /my/module

require (
...
github.com/someone/some_module v2.0.39
...
)

달리기 후 go mod tidy

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