[Go] Go Module (모듈) 정리 - golang wiki
Go에서의 Module은 Go package들의 의존성을 관리하는 Go 패키지 관리 시스템이다.
기존에 GO 개발 시, GOROOT 외부에서 GOPATH를 설정하여 개발하였던 방식의 불편함이 사라졌다. GOPATH를 사용하지 않아 동시에 여러 Go 프로젝트 개발이 편리해 졌다.
Go module 초기화 예제
go module 활성화
go 1.11 이상의 go 버전 설치가 필요하다. GOPATH 외부의 디렉터리를 이용할 경우 환경 변수 설정은 불필요하지만, 만약 GOPATH 내부의 디렉터리를 사용할 경우 아래와 같이 ‘GO111MODULE’ 환경 변수를 설정한다.
export GO111MODULE=on // available values 'on', 'off', 'auto'
‘GO111MODULE=auto’로 설정할 경우 go.mod 파일이 존재 하면 go module로 자동으로 인식되고, go 1.13 버전 이상부터는 ‘GO111MODULE=on’으로 설정하여 명시적으로 go module을 사용할 수 있다.
디렉터리 생성
GOPATH 경로가 아닌 곳에 go module을 위한 디렉터리를 생성한다.
$ mkdir -p /tmp/sunny/repo
$ cd /tmp/sunny/repo
$ git init -q
$ git remote add origin https://github.com/sunny/repo
module 초기화
go mod init 명령을 이용해서 모듈을 초기화 한다.
$ go mod init github.com/sunny/repo
go: creating new go.mod: module github.com/sunny/repo
테스트 코드 작성
$ cat <<EOF > hello.go
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println(quote.Hello())
}
EOF
테스트 코드 빌드
$ go build -o hello
$ ./hello
Hello, world.
module 의존성 확인
go.mod 파일을 확인하여 모듈 이름과 요구되는 의존성 패키지 버전 정보들을 확인 할 수 있다.
$ cat go.mod
module github.com/sunny/repo
require rsc.io/quote v1.5.2
‘go.mod’ file
모듈은 go.mod 라는 파일을 통해 패키지들을 관리한다.
// go.mod example
module github.com/my/thing
require (
github.com/some/dependency v1.2.3
github.com/another/dependency/v4 v4.0.0
)
기본적으로는 위의 예시처럼 맨 첫줄에 ‘module’ 키워크로 모듈 이름이 명시되고, 아래에는 ‘require’ 키워드로 의존하는 패키지 정보들이 버전과 함께 포함된다. ‘module’, ‘require’ 키워드 외에도 ‘exclude’, ‘replace’ 키워드가 존재한다.
- replace: 모듈의 특정 버전이나, 버전 전체를 대체 할 수 있다. require에 의해 설정된 의존성을, ‘=>’ 를 통해 우측에 설정된 패키지와 버전으로 대체시킨다.
// replace example
replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
replace (
golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
golang.org/x/net => example.com/fork/net v1.4.5
golang.org/x/net v1.2.3 => ./fork/net
golang.org/x/net => ./fork/net
)
- exclude: 패키지의 특정 버전을 사용하지 않도록 할 수 있다. 예를 들어 자동으로 require 에 들어갈 버전에 문제가 있을 경우 exclude 해 놓으면, require에는 최신 master의 버전이 설정되도록 할 수 있다.
// exclude example
exclude golang.org/x/net v1.2.3
exclude (
golang.org/x/crypto v1.4.5
golang.org/x/text v1.6.7
)
‘go.sum’ file
go.sum file은 go 모듈 생성 시 go.mod 파일과 함께 생성되는 checksum 파일이다.
Go version 체계
모듈은 아래의 형태처럼 semver version form을 따라서 버저닝 되어야한다.
v(major).(minor).(patch) // ex) v0.1.0, v1.2.3, or v1.5.0-rc.1.
만약 Git을 사용한다면 tag를 통해 버전을 관리 할 수 있다.
Module & Package & Package Import
관계
하나의 repository (Git repository로 관리 될 경우)는 하나 또는 여러개(일반적으로 하나)의 모듈들을 가질 수 있다. 각 모듈들은 하나 또는 여러개의 패키지들을 포함한다. 각 패키지들은 하나 또는 그 이상의 go source file 들을 하나의 디렉터리에 포함한다.
예시
아래와 같은 구조에서 module과 package 구조 예시를 확인 할 수 있다.
// module directory example
mymod
|-- bar
| `-- bar.go
|-- foo
| `-- foo.go
`-- go.mod
위의 구조는 모듈 ‘github.com/user/mymod’의 예시를 보여준다. go.mod 파일에 ‘github.com/user/mymod’의 이름으로 모듈 이름이 명시 되어 있고, ‘github.com/user/mymod/bar’, ‘github.com/user/mymod/foo’의 패키지를 가진다. 이 패키지들은 다른 go source들에서
import "github.com/user/mymod/bar"
와 같은 import 문으로 import 될 수 있다.
Go 의존성 패키지 버전 관리
사용하는 패키지의 버전을 관리하는 방법에는 ‘go get’ 명령을 이용하는 방법과 ‘go.mod’ 파일을 직접 수정하는 방법이 있다. ‘go build’, ‘go test’, or even ‘go list’와 같은 go 명령어들을 실행 할 때 자동으로 go.mod 파일의 패키지 의존성이 업데이트 된다.
Get/Upgrade a dependency
‘go get’ 명령어를 통해 의존성을 가져오거나 업데이트 할 수 있다. ‘go get {target package name}’의 형태로 의존성을 가져올 수 있다. 버전을 명시하지 않을 경우 사용가능한 latest 버전이 설정된다.
go get example.com/package // To get/upgrade a dependency to the latest version
go get -u example.com/package // To get/upgrade a dependency and all its dependencies to the latest version
‘@’를 이용해 브랜치, 버전, commit을 지정할 수 있다.
go get example.com/package@master // set branch
go get example.com/package@v1.1.1 // set version
go get example.com/package@ab1234 // set commit id
가능한 minor, patch 확인하기
go list 명령어를 통해 가능한 minor, patch 들을 확인 할 수 있다.
go list -u -m all
기타 Go mod commands
‘go mod tidy’ command
더이상 필요없는 의존성 파일들을 정리해 주고, go.mod 파일에 추가되지 않은 패키지들을 추가해 준다.
‘go mod graph’ command
module require 패키지들의 관계를 그래프 형태로 출력 할 수 있다.
Source
- https://github.com/golang/go/wiki/Modules
- https://golang.org/ref/mod
- https://stackoverflow.com/questions/53473290/how-the-exclude-directive-works-in-the-go-mod-file
Leave a comment