본문 바로가기

Go

GO111MODULE

 

go get 은 1.17 이후로 바이너리 설치에 사용되지 않을 것이고,

1.18 에서는 사용이 불가능할 것이다.

1.16 이상을 사용하는 경우는 go install @latest 를 사용해야 한다.

 

 

GOPATH

초기 go 는 package manager 없었고,

go get 이 모든 소스들을 fetch 하고 $GOPATH/src 에 저장하였다.

여기서 버전은 따로 없었고, master branch 만이 package 의 안정버전을 의미했다.

 

 

Go Modules

Go Modules 는 go 1.11 에 처음 소개되었다.

모든 package 의 git checkout 저장을 위해 GOPATH 를 사용하는 것 대신에

Go Modules 는 tag된 버전을 go.mod 를 통해 추적했다.

(go.mod 파일에 사용 된 각각의 패키지 버전을 명시)

 

이 이후로, GOPATH 와 GO Modules 간 상호작용이 go 의 가장 큰 문제중 하나가 되었다.

 

 

GO111MODULE

go 가 package 들을 어떻게 import 할지 결정하는 환경 변수

그런데 이 값은 go version 에 따라서 그 의미가 변한다. 

이 환경변수의 값은 on, off, auto 중 하나가 사용된다.

 

 

### Go 1.11 ~ 1.12

on

  • Project가 GOPATH 에 있어도, Go modules 사용을 강제한다.
  • 그래서, go.mod 파일이 있어야 한다.

off

  • GOPATH 밖에 있어도, GOPATH 방식으로 동작한다.

auto

  • default mode
  • GOPATH 밖에 있는 경우, on 형태로 동작
  • go.mod 가 존재하더라도 GOPATH 안에 있는 경우, off 형태로 동작

 

### Go 1.13

default mode 의 변화가 존재

  • go.mod 가 존재하거나, go.mod 가 존재하지 않더라도 GOPATH 밖에 있으면, on 형태로 동작
  • GOPATH 내에서 go.mod 가 없으면 off 형태로 동작

 

### Go 1.14 ~ 1.15(?)

1.13 과 같은 동작 방식이지만, 

GO111MODULE 과 무관한 동작에서 약간의 차이가 존재

 

 

### Go 1.16

1.16 부터, default 방식이 on 으로 바뀌었고,

예전 GOPATH 방식을 유지하길 원한다면, GO111MODULE 값을 off 로 변경해야 함.

 

하지만 좋은 소식은 go tool 설치를 위한 전용 명령어가 있다는 것.

go install golang.org/x/tools/gopls@latest

 

go get 과 go install 간 약간의 차이가 존재한다.

 

 

### Go 1.17

GO111MODULE=auto 는 GO111MODULE=on 과 동일

예전 GOPATH 방식을 유지하길 원한다면, GO111MODULE 값을 off 로 변경해야 함.

 

여기서는 GO111MODULE 를 어떻게 사용 할지 영향을 주는 3가지 중요한 변경점이 존재

  1. Faster downloading of dependencies if you are using Git to fetch modules
  2. Installing binaries with GO111MODULE=on go get is deprecated
  3. go run knows about @version
    1. If you were running the binary from a go.mod enabled project, you could specify the version of the binary you want to run in your go.mod and then run go run -mod=mod.

 

[결론]

GO111MODULE=on 은 git tags 에 근거하여 내가 특정 버전을 선택 할 수 있게 해주고,

=> 최신 버전을 명시하고 싶을 경우 @latest

GO111MODULE=off 는 master 로 부터 최신 commit 을 fetch 하게 해준다.

 

 

[99. ref]

https://maelvls.dev/go111module-everywhere/

 

'Go' 카테고리의 다른 글

go heap container  (0) 2022.09.08
go mod  (0) 2022.08.10
go 패키지 설치, 관리  (0) 2022.08.10
ubuntu go version update  (0) 2022.04.06
cgo  (0) 2022.03.19