Golang의존모듈관리툴 Modules

최승훈·2020년 8월 4일
0

Golang응용

목록 보기
1/1

Go modules란?

Golang 1.1v부터 표준으로 사용되고있는 의존관리 툴.

1. Modules의 기능

(1). 의존모듈의 관리
(2). 의존모듈의 버전고정 및 버전업관리

의존모듈 정보는 go.mod 과 go.sum 이라는 이름의 파일에 기재되어있음.
git과같은 버전관리툴과의 연계로 의존모듈과 그 모듈의 버전을 명확히관리 하는것이 가능.

다른언어의 의존모듈관리 툴
자바 -> Maven, Gradle
Ruby -> Bundler
Node.js -> npm
Python -> pip
과같은 역할.

2. Modules을 사용하기 앞서서

Golang버전이 1.1이상이여야 go mod커맨드를 사용할수 있게 됨.
Golang 버전을 확인 할 것.

3. Modules사용방법

  1. go mod init 으로 초기화
  2. go build 의존관리모듈 자동 인스톨
  3. go list -m all 현재 의존 모듈리스트 출력
  4. go get 의존모듈의 추가 및 버전업 실행
  5. go mod tidy 사용하지않는 의존모듈을 삭제

(1). go mod init

새로운 프로젝트를 만들어 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

(2). go build

빌드 대상 파일 코딩.
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의 정보가 기재되어있는것을 확인 할 수 있음.

(3). go list -m all

현재 의존모듈을 표시하는 커맨드.

~/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

현재 프로젝트에서 직접의존하고있는 모듈뿐만아니라 의존모듈이 의존하고있는 모듈 까지 출력됨.

(4). go get

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>

(5). go mod tidy

사용하지 않는 의존모듈 삭제.

~/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로부터 삭제되어있음.

4.전체의존모듈을인스톨하고싶은경우

CI/CD에서 처음으로 의존모듈을 전체 인스톨하고 싶은경우의 커맨드

go get -u -t ./...

5.환경변수 GO111MODULE설정

기존프로젝트에 Modules를 사용하고 싶은경우(GOPATH가 설정되어있는),
아래의 환경변수 설정이 필요함.

export GO111MODULE=on

위의 환경변수를 설정안한채로 go init을 하게되면 에러가 나옴.

profile
안녕하세요

0개의 댓글