Dev
go mod (golang 1.13 추가 사항) 요약
ingeeC
2019. 9. 18. 20:12
golang 1.13 릴리즈를 통해 "go 모듈 (이후 go mod)" 지원이 강화됨
- 몇 주 전 (2019-09-03) golang v1.13 이 릴리즈 됨. 이 버전의 가장 큰 특징은 go mod 지원이 강화된 것 (이제 옵셔널 피쳐가 아니라 디폴트 피쳐).
- go mod 관련 릴리즈 히스토리
- v1.11 (2018-08-24)
- go mod 지원 시작 (옵셔널 피쳐로 추가)
- $GO111MODULE (임시) 환경 변수값에 따라 go mod 지원 방식 결정 (on, off, auto)
- v1.12 (2019-02-25)
- v1.13 (2019-09-03)
- go mod 지원 강화 (go mod 방식이 디폴트 피쳐가 됨)
- 구글이 운영하는 go module mirror와 go checksum DB를 사용 (디폴트)
- v1.11 (2018-08-24)
- golang의 강점은 "하위 호환성 보장"
- 2012년 golang 1.0 출시 이래 지켜져 온 약속
- go mod 기능도 하위 호환성을 고려함
- 예전 $GOPATH/src 디렉토리 체계도 지원
- 예전 vendor 디렉토리 체계도 지원
golang 모듈이란?
- golang의 모듈이란 버전이 붙은 패키지들의 묶음을 말함 (패키지는 소스코드 파일들의 묶음).
- go mod 체계의 구성 요소
- go.mod 파일
- 의존하는 모듈과 버전을 명시하는 파일
- go.sum 파일
- 모듈의 파일이 바뀌지 않았음을 확인하기 위해 저장하는 첵썸 파일
- go 명령이 go.mod 에 정의된 모듈을 다운로드할 때 각 모듈의 첵썸값을 go.sum 파일에 자동 기록
- 이를 첵썸 디비(아래 설명)와 대조, 모듈 내용의 변경 여부를 확인
- module mirror
- 모듈을 다운로드 하는 서버
- 모듈의 소스레포가 죽었을 경우 (또는 폐기되었을 경우) 대비 (그런 경우에도 모듈 다운로드 보장)
- go 명령이 디폴트 참조하는 미러 서버를 구글이 운영 (proxy.golang.org)
- 관련 명령 : go get, go build, ...
- check sum DB
- 모듈이 위/변조 되지 않았는지 확인하는 서버
- go 명령이 디폴트 참조하는 첵썸 디비를 구글이 운영 (sum.golang.org)
- 관련 명령 : go get, gosumcheck, ...
- go.mod 파일과 go.sum 파일은 소스관리 대상
- go.mod 파일
go mod 를 사용하면 무엇이 좋은가?
- $GOPATH/src 디렉토리 바깥에 프로젝트 디렉토리를 만들 수 있음
- vendor 디렉토리를 사용하지 않아도 됨
- reproducible build (언제,어디서나,누구라도 항상 동일한 build 결과를 보장함)
go mod 철학
- reproducible build
- 검증된 빌드 / 반복 가능한 빌드
- go.mod 파일과 module mirror 서비스를 이용하여 처리
- immutable dependency
- semantic versioning (SemVer : https://semver.org/spec/v2.0.0.html)
- 모듈의 버전은 v0.0.0 포맷 버전 체계로 한다 (강제사항)
- 첫 글자 v 필수
- 버전 숫자 3개 필수 (major ver, minor ver, patch ver)
- semantic import versioning
- major 버전에 따라 import path 를 달리 가져간다 (ex. import "my/thing/v2/sub/pkg)
- v0, v1은 import path 에 버전을 포함하지 않는다 (기존 import path 그대로)
- go.sum 파일과 check sum DB 서비스를 이용하여 처리
- semantic versioning (SemVer : https://semver.org/spec/v2.0.0.html)
- minimal version selection
- go.mod 에 참조 모듈을 서술할 때 minimum ver 만 명시한다
- (node.js 의 npm 같은) 다른 패키지 관리자처럼 go.mod 에 incompatibility 를 서술하지 않는다
- go.mod를 해석하여 참조 모듈을 선택할 때, minimum version 을 선택하는 방식이
- 모듈 업그레이드로 인한 빌드 실패 발생 확률을 낮춘다 (reproducible/repeatable build 보장)
- 모듈 업그레이드로 인해 빌드 실패 발생시, golang 커뮤니티가 해결 시간을 더 확보할 수 있다
- go 명령어를 이용하여 처리 (go get, go build, go test, ...)
- go.mod 에 참조 모듈을 서술할 때 minimum ver 만 명시한다
go mod 사용 방법
- 기존 프로젝트를 go mod 체계로 이전하는 방법
- (golang 업그레이드를 위해) 기존 go 설치물 제거
sudo rm -rf /usr/local/go/
- go v1.13 설치
curl -O https://dl.google.com/go/go1.13.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
- 프로젝트 루트에서 go mod 초기화
cd PROJECT_ROOT go mod init
- go.mod 파일, go.sum 파일 확인
- build & test 성공 확인
go build go test
- (golang 업그레이드를 위해) 기존 go 설치물 제거
추가로 알면 좋은 것들
-
go.mod 샘플
module "my/thing" require ( "google.golang.org/appengine" v1.0.0 "github.com/google/go-github" v0.0.0-20180116225909-922ceac0585d )
-
go.mod 파일을 구성하는 명령 목록
- module, require, exclude, replace 명령 사용 가능 (4개뿐)
module "my/thing" require "other/thing" v1.0.2 require "new/thing" v2.3.4 exclude "old/thing" v1.2.3 replace "bad/thing" v1.4.5 => "good/thing" v1.4.5
- module, require, exclude, replace 명령 사용 가능 (4개뿐)
-
go.mod 파일은 직접 작성/수정할 필요 없음
- go 명령을 통해 자동 작성/수정됨
go mod init # .git, Gopkg.toml, Gopkg.lock 등을 참조하여 go.mod 파일 생성 go get, go build # go.mod 파일 업데이트 # 소스코드에서 import 한 파일 목록을 찾아 # 1. go.mod 파일에 추가 # 2. GOPATH/pkg/mod 디렉토리에 버전별로 설치 # 3. 프로젝트 루트에 go.sum 파일 생성 go tidy # go.mod 파일과 소스코드를 비교/검증하여, go.mod 파일 목록을 (다시한번 단단히) 정리 go mod verify # 로컬에 설치된 모듈의 해시 값과 go.sum 파일을 비교하여 검증
- go 명령을 통해 자동 작성/수정됨
ref
다음 2개의 자료를 순서대로 보는 것을 추천함.
- youtube: Opening keynote: Go with Versions - GopherConSG 2018
- Go 1.11 Modules
- https://github.com/golang/go/wiki/Modules
- golang 프로젝트 공식 문서 (위키)
- 동영상을 본 다음 볼 것을 권장
(이상)