Golang 1.1v부터 표준으로 사용되고있는 의존관리 툴.
(1). 의존모듈의 관리
(2). 의존모듈의 버전고정 및 버전업관리
의존모듈 정보는 go.mod 과 go.sum 이라는 이름의 파일에 기재되어있음.
git과같은 버전관리툴과의 연계로 의존모듈과 그 모듈의 버전을 명확히관리 하는것이 가능.
다른언어의 의존모듈관리 툴
자바 -> Maven, Gradle
Ruby -> Bundler
Node.js -> npm
Python -> pip
과같은 역할.
Golang버전이 1.1이상이여야 go mod커맨드를 사용할수 있게 됨.
Golang 버전을 확인 할 것.
go mod init
으로 초기화go build
의존관리모듈 자동 인스톨go list -m all
현재 의존 모듈리스트 출력go get
의존모듈의 추가 및 버전업 실행go mod tidy
사용하지않는 의존모듈을 삭제새로운 프로젝트를 만들어 go mod init
을 실행.
커맨드의 인수로 example.com/go-mod-test
를 지정했지만
프로젝트의 git주소/프로젝트명을 커맨드의 인수로 넘겨주는 형식으로도 가능.
// go-mod-test 프로젝트 디렉토리 생성
~/dev
❯ mkdir go-mod-test
// 이동
~/dev
❯ cd go-mod-test
// go modules초기화
~/dev/go-mod-test
❯ go mod init example.com/go-mod-test
go: creating new go.mod: module example.com/go-mod-test
// 생성된 go.mod내용 확인
~/dev/go-mod-test
❯ cat go.mod
module example.com/go-mod-test
go 1.12
빌드 대상 파일 코딩.
AWS Lambda의 핸들러 예제 코드.
package main
import (
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
return events.APIGatewayProxyResponse{}, nil
}
func main() {
lambda.Start(handler)
}
aws-lambda-go
모듈을 의존하는 상태.
go build실행
~/dev/go-mod-test
❯ go build
~/dev/go-mod-test
❯ cat go.mod
module example.com/go-mod-test
go 1.12
require github.com/aws/aws-lambda-go v1.18.0
go.mod의 내용을 보면 의존하고있는 aws-lambda-go의 정보가 기재되어있는것을 확인 할 수 있음.
현재 의존모듈을 표시하는 커맨드.
~/dev/go-mod-test
❯ go list -m all
example.com/go-mod-test
github.com/BurntSushi/toml v0.3.1
github.com/aws/aws-lambda-go v1.18.0
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
github.com/davecgh/go-spew v1.1.0
github.com/pmezard/go-difflib v1.0.0
github.com/russross/blackfriday/v2 v2.0.1
github.com/shurcooL/sanitized_anchor_name v1.0.0
github.com/stretchr/objx v0.1.0
github.com/stretchr/testify v1.4.0
github.com/urfave/cli/v2 v2.1.1
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
gopkg.in/yaml.v2 v2.2.2
현재 프로젝트에서 직접의존하고있는 모듈뿐만아니라 의존모듈이 의존하고있는 모듈 까지 출력됨.
go get
으로 의존 모듈의 추가 및 버전업데이트
~/dev/go-mod-test
❯ go get github.com/golang/glog
go: finding github.com/golang/glog latest
go: downloading github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
go: extracting github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
go get으로 golang/glog
의 의존모듈 추가
~/dev/go-mod-test
❯ cat go.mod
module example.com/go-mod-test
go 1.12
require (
github.com/aws/aws-lambda-go v1.18.0
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
)
go.mod에 해당 모듈 정보가 추가되어있는것을 확인할수 있음
// indirect
는 직접의존하고있는모듈이아닌것을 표시함.
방금 추가한 golang/glog
을 사용하지 않고있기 때문에 // indirect
가 표시 되어있음.
git같은경우 브런치 지정으로 go get이 가능함
go get <path-to-repo>@<branch>
사용하지 않는 의존모듈 삭제.
~/dev/go-mod-test
❯ go mod tidy
go mod tity커맨드 실행.
❯ cat go.mod
module example.com/go-mod-test
go 1.12
require github.com/aws/aws-lambda-go v1.18.0
사용하지 않았던 golang/glog
가 go.mod로부터 삭제되어있음.
CI/CD에서 처음으로 의존모듈을 전체 인스톨하고 싶은경우의 커맨드
go get -u -t ./...
기존프로젝트에 Modules를 사용하고 싶은경우(GOPATH가 설정되어있는),
아래의 환경변수 설정이 필요함.
export GO111MODULE=on
위의 환경변수를 설정안한채로 go init
을 하게되면 에러가 나옴.