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 에서 로컬 모듈의 경로를 지정해 줘야 한다는 것 입니다.

외부 라이브러리 임포트 하기

사용 가능한 라이브러리

gin · pkg.go.dev

pkg.go.dev 는 라이브러리가 모듈 시스템을 지원하는지 알려줍니다.

Valid go.mod file 항목이 체크 표시이면 모듈 시스템을 지원함을 의미 합니다.

라이브러리 의존성 추가

gin-gonic/gin
Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin. - ...

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 폴더 안에 gingin 의 의존 라이브러리가 추가 됩니다.

main.go 의 오류가 없어졌습니다.

라이브러리 유효성 검증

로컬에 설치된 모듈의 해시 값과 go.sum 에 저장된 해시를 비교하여 라이브러리를 검증 합니다.

$ go mod verify
all modules verified

라이브러리 배포하기

--TODO--