Go는 1.11 버전부터 모듈 시스템을 도입 했습니다. 1.16 버전부터 모듈 방식이 기본 옵션이 되었고, 1.17 버전부터 GOPATH
를 배제하고, 모듈만 지원할 계획이라고 합니다.
모듈의 가장 큰 강점은 기존의 GOPATH
방식의 여러 프로잭트를 작업 하거나, 프로젝트를 변경 할 때마다 GOPATH
를 수정하는 작업 과정이 필요 없습니다.
모듈을 사용한 프로젝트를 만들자
프로젝트 폴더 생성
$ mkdir boo
$ cd boo
원하는 이름의 폴더를 만듭니다.
모듈 생성
$ go mod init boo
go: creating new go.mod: module boo
프로젝트 모듈을 생성합니다. go.mod
라는 Go 모듈 파일이 만들어집니다.
만약 공개 프로젝트를 생성 하려면, 다음처럼 코드를 배포한 github 주소까지 입력하는 것이 좋습니다.
$ go mod init github.com/vompressor/boo
go: creating new go.mod: module github.com/vompressor/boo
main.go 생성
$ touch main.go
코드를 작성할 파일을 생성 합니다. go는 프로젝트 안에 go.mod
가 존재할 경우, 자동으로 모듈 방식으로 실행됩니다.
main.go
를 다음처럼 작성 합니다.
package main
func main() {
println("hello")
}
코드를 실행합니다.
$ go run main.go
hello
GOPATH
값을 수정하지 않아도 잘 실행됩니다.
로컬 패키지 임포트 하기
프로젝트가 다음처럼 구성되어 있습니다.
.
├── go.mod // -> module boo
├── lib
│ ├── div
│ │ └── div.go // -> package div
│ └── sub
│ └── sub_func.go // -> package sub
├── main.go
└── sum
└── sum.go // -> package sum
main.go
에서 div
, sum
, sub
패키지를 임포트 하려면 다음처럼 작성 합니다.
package main
import (
"boo/sum"
"boo/lib/div"
"boo/lib/sub"
)
func main() {
}
로컬 모듈 임포트 하기
프로젝트가 다음처럼 구성되어 있습니다.
.
├── calc // -> module calc
│ ├── go.mod
│ ├── sub
│ │ └── sub.go // -> package sub
│ └── sum
│ └── sum.go // -> package sum
├── go.mod // -> module boo
└── main.go
calc
모듈은 다음처럼 임포트 합니다.
./go.mod
module boo
go 1.16
require (
calc v0.0.0
)
replace (
calc v0.0.0 => ./calc
)
calc
버전은 임의로 붙입니다. 중요한 것은 replace
에서 로컬 모듈의 경로를 지정해 줘야 한다는 것 입니다.
외부 라이브러리 임포트 하기
사용 가능한 라이브러리
pkg.go.dev
는 라이브러리가 모듈 시스템을 지원하는지 알려줍니다.
Valid go.mod file
항목이 체크 표시이면 모듈 시스템을 지원함을 의미 합니다.
라이브러리 의존성 추가
Go의 마이크로 웹 프레임워크인 Gin
을 임포트 하겠습니다.
$ go get github.com/gin-gonic/gin
go.mod
에 라이브러리가 추가 됩니다.
gin
을 사용해 보겠습니다.
라이브러리 임포트에 오류가 생깁니다. 라이브러리가 go.mod
파일에 추가는 되었지만 (외부 라이브러리 의존성 추가 했으나), 실제 라이브러리 파일이 없기 때문입니다.
라이브러리 정리하기
다음 명령어로 라이브러리를 정리 합니다.
$ go mod tidy
이는 다음 작업을 수행 합니다.
import
되지 않은 라이브러리 의존성 제거import
되었으나 의존성에 추가되지 않은 라이브러리 의존성 추가- 실제 라이브러리 파일 정리, 다운로드
만약 vendor
명령 사용 시 tidy
명령 실행 후 vendor
명령으로 라이브러리를 다시 받아줍니다.
$ go mod vendor
라이브러리 프로젝트로 받기
다음 명령어로 의존성 있는 실제 라이브러리를 프로젝트에 다운 받습니다.
$ go mod vendor
프로젝트내 vendor
폴더 안에 gin
과 gin
의 의존 라이브러리가 추가 됩니다.
main.go
의 오류가 없어졌습니다.
라이브러리 유효성 검증
로컬에 설치된 모듈의 해시 값과 go.sum
에 저장된 해시를 비교하여 라이브러리를 검증 합니다.
$ go mod verify
all modules verified
라이브러리 배포하기
--TODO--