[Go 공식문서 한국어 정리] ①4⑧. Go Modules로 마이그레이션
Go Modules로 마이그레이션
https://go.dev/blog/migrating-to-go-modules
Go 1.11에서 도입된 모듈 시스템은 공식 의존성 관리 솔루션입니다. 이 글에서는 기존 프로젝트를 모듈로 전환하는 방법을 설명합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
Go 프로젝트는 dep, glide 등 다양한 의존성 관리 전략을 사용해 왔습니다. 모듈 시스템은 go 명령어에 내장된 공식 솔루션으로, 기존 도구의 비호환성 문제를 해결합니다.
② 핵심 개념
1. go mod init: 모듈을 초기화하고 go.mod 파일을 생성합니다.
2. go mod tidy: 모든 의존성을 찾아 추가하고 불필요한 것을 제거합니다.
3. go.sum: 각 라이브러리의 체크섬을 저장합니다.
4. 정식 모듈 경로: import 경로와 go.mod의 module 경로가 일치해야 합니다.
5. v2 이상: 모듈 경로에 /v2 접미사가 필요합니다.
③ 주요 내용 상세
의존성 관리자가 있는 경우
$ go mod init github.com/my/project
- Godeps/Godeps.json, Gopkg.lock 등을 자동으로 가져옵니다.
$ go mod tidy
- 모든 패키지의 전이적 의존성을 찾아 추가합니다.
- 불필요한 의존성은 제거합니다.
$ go list -m all
- 선택된 버전을 확인하고 기존과 비교합니다.
$ go mod why -m <module>
- 특정 의존성이 필요한 이유를 확인합니다.
의존성 관리자가 없는 경우
$ go mod init golang.org/x/blog
- module과 go 지시문만 있는 기본 go.mod를 생성합니다.
$ go mod tidy
- import 문을 분석하여 의존성을 자동으로 추가합니다.
- 최신 버전을 사용하므로, GOPATH에 있던 구버전과 다를 수 있습니다.
테스트 관련 주의사항
- 모듈 캐시는 읽기 전용이므로 테스트가 패키지 디렉토리에 파일을 쓰면 실패합니다. 임시 디렉토리를 사용하세요.
- 다른 모듈의 상대 경로(../package)를 사용하는 테스트는 실패할 수 있습니다.
- 테스트 낭의 go 명령이 GOPATH 모드를 기대하면 GO111MODULE=off를 설정하세요.
릴리스 및 정식 경로
- 정식 릴리스를 위해 git tag v1.2.0 && git push origin v1.2.0를 사용하세요.
- 정식 모듈 경로(canonical path)와 import 문이 일치해야 합니다.
- github.com/golang/lint 대신 golang.org/x/lint처럼 go.mod에 선언된 경로를 사용해야 합니다.
④ 실전 활용
- 기존 dep/glide 프로젝트를 go mod init으로 쉽게 전환할 수 있습니다.
- go mod tidy는 커밋 전에 항상 실행하는 것이 좋습니다.
- go get module@version으로 특정 버전으로 업그레이드/다운그레이드할 수 있습니다.
- replace 지시문으로 로컬 경로를 대체하여 개발할 수 있습니다.
- go mod vendor로 vendor 디렉토리를 생성하여 오프라인 빌드를 지원할 수 있습니다.
⑤ 정리
Go Modules로의 전환은 대부분의 프로젝트에서 간단합니다. go mod init과 go mod tidy만으로 기존 의존성을 모듈로 가져올 수 있으며, go list -m all로 버전을 감사한 후 go get으로 조정하면 됩니다. 정식 모듈 경로와 v2 이상의 접미사 규칙만 주의하면 쉽게 마이그레이션할 수 있습니다.
#Go #Golang #Modules #마이그레이션 #의존성관리 #go.mod #go.sum #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30