Go Path vs Go Module

Aiden·2021년 7월 8일
0
post-thumbnail

의존성 & 패키지 관리

버전에 따른 변화

v1.11 이전

Golang은 의존성 및 패키지 관리 방법으로, GOPATH 내에서만 관리하는 방법을 취했다.

이로 인해 $GOPATH/src 하위 디렉토리에서만 프로젝트를 생성할 수 있었다.

v1.16 이전

1.11 이후 Go Module 기능이 제공되었고, GO111MODULE이라는 환경변수를 통해 Go Module 사용 여부를 설정 가능했다.

작성일 기준 최신 버전인 1.16은 Default로 Go Module 사용이 활성화 되어있다.

v1.17 이후

1.17 버전 이후부터는 GOPATH를 통한 의존성 & 패키지 관리 기능이 없어질 예정이다.

특징

GOPATH

이 방식의 단점으로 인해 Go Module이 나왔기 때문에, 사실 장점이라고 할 건 없다. 여러 프로젝트를 관리하는데 있어 GOPATH 단일 경로를 통해 관리한다면, 각 프로젝트의 의존성 패키지가 서로 섞여 관리가 힘들어진다.

Go Module

패키지와 의존성 관리가 어려워 Python에서 virtualenv, pipenv 등의 가상환경을 사용하는 것 처럼, Javascript에서 package.json을 통해 관리하는 것 처럼, 패키지 & 의존성 관리를 프로젝트 별로 할 수 있다는 데에 의미가 있다.

의존성 패키지를 설치하지 않은 상태에서 코드를 실행하면, 의존성 패키지를 자동으로 다운받는다. 패키지는 $GOPATH/pkg 경로에 저장된다.

참고로, vscode 기준 Go Module 사용시 $GOPATH 외부 디렉토리에서 프로젝트를 사용해야한다. 그렇지 않으면, 외부 라이브러리 import 시 lint 에러가 발생한다.

명령어

go mod init [path]

의존섬 패키지 목록을 명시하는 파일인 go.mod를 생성하는 명령어이다. path에는 해당 프로젝트의 패키지 명을 입력한다. path는 github에 업로드 후 모듈로 사용하게 되면, github.com/계정명/프로젝트명 과 같은 형태로 사용하기 때문에, 이 형태로 작성하는것을 권장한다.

go get [path]

path에 패키지 주소를 입력하여 외부 패키지를 다운받는다. 이 때, go.mod에도 함께 기록한다.

go mod vendor

$GOPATH 의 경로에서 해당 프로젝트 경로로 의존성 패키지를 복사한다. 복사한 패키지를 통해 로컬 vendor 경로의 패키지를 사용할 수 있다. (go run -mod vendor main.go)

profile
기억이 안되면 기록이라도🐳

0개의 댓글