Golang은 의존성 및 패키지 관리 방법으로, GOPATH 내에서만 관리하는 방법을 취했다.
이로 인해 $GOPATH/src 하위 디렉토리에서만 프로젝트를 생성할 수 있었다.
1.11 이후 Go Module 기능이 제공되었고, GO111MODULE이라는 환경변수를 통해 Go Module 사용 여부를 설정 가능했다.
작성일 기준 최신 버전인 1.16은 Default로 Go Module 사용이 활성화 되어있다.
1.17 버전 이후부터는 GOPATH를 통한 의존성 & 패키지 관리 기능이 없어질 예정이다.
이 방식의 단점으로 인해 Go Module이 나왔기 때문에, 사실 장점이라고 할 건 없다. 여러 프로젝트를 관리하는데 있어 GOPATH 단일 경로를 통해 관리한다면, 각 프로젝트의 의존성 패키지가 서로 섞여 관리가 힘들어진다.
패키지와 의존성 관리가 어려워 Python에서 virtualenv, pipenv 등의 가상환경을 사용하는 것 처럼, Javascript에서 package.json을 통해 관리하는 것 처럼, 패키지 & 의존성 관리를 프로젝트 별로 할 수 있다는 데에 의미가 있다.
의존성 패키지를 설치하지 않은 상태에서 코드를 실행하면, 의존성 패키지를 자동으로 다운받는다. 패키지는 $GOPATH/pkg 경로에 저장된다.
참고로, vscode 기준 Go Module 사용시 $GOPATH 외부 디렉토리에서 프로젝트를 사용해야한다. 그렇지 않으면, 외부 라이브러리 import 시 lint 에러가 발생한다.
의존섬 패키지 목록을 명시하는 파일인 go.mod를 생성하는 명령어이다. path에는 해당 프로젝트의 패키지 명을 입력한다. path는 github에 업로드 후 모듈로 사용하게 되면, github.com/계정명/프로젝트명 과 같은 형태로 사용하기 때문에, 이 형태로 작성하는것을 권장한다.
path에 패키지 주소를 입력하여 외부 패키지를 다운받는다. 이 때, go.mod에도 함께 기록한다.
$GOPATH 의 경로에서 해당 프로젝트 경로로 의존성 패키지를 복사한다. 복사한 패키지를 통해 로컬 vendor 경로의 패키지를 사용할 수 있다. (go run -mod vendor main.go)