go 1.11 modules 사용하기

# go1.11 부터 지원되는 패키지지 관리자 modules 이 추가되었다.
# go modules 은 GOPATH, vendor 대신 GOPATH/pkg/mod 에 패키지를 다운로드 한다.
# go go modules 는 아직 실험단계로
# 사용하기 위해선 다음과 같이 환경변수 설정이 되어야 한다.
# 또는 매번 go 명령시 GO111MODULE=on 를 명시
GO111MODULE=on

# go modules 를 사용하면 go.mod 파일로 패키지를 명시한다.
# go.mod 생성
go mod init

# 다음 go 명령을 수행하면 go.mod 파일에
# semantic 버전으로 패키지가 명시된다.
go build
go test
go list
module example.com/m
require (
    golang.org/x/text v0.3.0
    gopkg.in/yaml.v2 v2.1.0
)

# untagged revision(Pseudo-versions) 은 다음과 같은 형식으로 생성된다.
v0.0.0-yyyymmddhhmmss-abcdefabcdef

# 빌드 필요한 전체 패키지보기
go list -m all

# go test, go build 등으로 패키지 새로 다시 받을 경우
# modules cache 와 go.sum(패키지 변경 사항 비교를 위한) 파일을 삭제해야 한다
sudo rm -rf $GOPATH/pkg/mod/cache
rm -f go.sum
go test ./...

# ./vendor 디렉토리 패키지를 사용해서 빌드하는 경우
go build -mod=vendor

# 기타 자세한 내용은 go v1.11 에서
go help modules

# go.mod 특정 버전, 커밋을 추가할때
https://golang.org/cmd/go/#hdr-Module_queries
# 다음과 같이 커밋 해시를 사용하면 해당 커밋상태를 go.mod 를 추가한다.
go get github.com/gorilla/mux@e3702bed2

# go 1.13 부터는 GO111MODULE=auto 가 디폴트로 설정되어 있다.
GO111MODULE=auto 는
현재 프로젝트가 GOPATH 안에 있으면 GO111MODULE=off
현재 프로젝트가 GOPATH 밖에 있으면 GO111MODULE=on
으로 동작한다.

# GO111MODULE=on 이면 GOPATH 가 아닌 경로에서 프로젝트(디렉토리)를 구성할 수 있다.
# GOPATH 안에 프로젝트를 만들면 자동으로 모듈명을 파악해 go.mod
# go mod init 이 다음과 같이 GOPATH 밖에 있어 모듈 경로를 명시해야 하는 경우
go: cannot determine module path for source directory /home/ysoftman/workspace/test_code/golang/wordcount (outside GOPATH, module path must be specified)

# 다음같이 모듈명을 직접 명시해야 한다.
go mod init wordcount


#####


# vscode-go extension 사용시 다음과 같이 추가해주자.
"go.toolsEnvVars": {
    "GO111MODULE": "on"
},

# vscode-go 에서 go.formatTool 로
# goimports 또는 goreturns(gofmt+goimports) 사용시 module 을 찾지 못해 import 에서 자동 삭제되는 문제가 있다.
https://github.com/Microsoft/vscode-go/issues/1532#issuecomment-402294022
# 최신 툴로 업데이트 하니 아직 미해결상태다.
go get -u golang.org/x/tools/...

comments:

댓글 쓰기