Go 1.16 버전 부터는 기본적으로 module 을 사용하게 변경 되었다. 덕분에 GOPATH 와 상관없이 아무 위치에서든 자신의 소스파일을 작성하면 된다. 그리고 모듈을 사용하기 위한 go.mod 파일이 반드시 필요하게 되었다. 하지만 1.16 버전에서도 선택적으로 module 사용을 할지 말지 여부를 결정 할 수 있다. 예를 들어 기존 프로젝트 구조가 GOPATH 내 src 를 사용하는 경우등이 해당될수 있다.

이를 위해서는 먼저 shell 의 env 변수를 설정하여 go.mod 가 존재하는 경우에만 모듈 인식 모드로 동작하게 설정한다 (이것은 1.16 버전 이전에는 기본값이었지만 이제 명시적으로 설정이 필요하다).

export GO111MODULE=auto

영구적으로 설정을 저장하려면 -w 옵션을 사용한다.

go env -w GO111MODULE=auto

go.mod 유무 상관없이 항상 GOPATH 를 참조하게 하려면 off로 설정하면 된다.

export GO111MODULE=off

이렇게 하면 더이상 모듈 인식이 사용되지 않게 되고, go.mod 파일도 필요하지 않다. (하지만 이 방법도 Go 1.17 버전부터는 이러한 GO111MODULE 설정은 무시되고 무조건 module 을 사용하게 된다고 하니 그때는 마이그레이션을 해줘야 한다).

간단한 테스트를 해보자. 먼저 go env 를 확인해 본다.

root:~/go/src/sample> go env | egrep 'PATH|GO111MODULE'
GO111MODULE="auto"
GOPATH="/root/go"

$GOPATH/src 에서 다음 구조로 만들어 주고 소스코드를 작성한다.

root:~/go/src> tree
.
└── kojh_test
    ├── test_lib
    │   └── my_lib.go
    └── test_main
        └── main.go

root:~/go/src> cat kojh_test/test_lib/my_lib.go

package test_lib

func MyLibTest() string {
    return "This is from MyLibTest in test_lib"
}

root:~/go/src> cat kojh_test/test_main/main.go

package main

import (
    "fmt"
    "kojh_test/test_lib"
)

func main() {
    message := test_lib.MyLibTest()
    fmt.Println(message)
}

my_lib.go 를 빌드한다.

root:~/go/src/kojh_test/test_lib> go build kojh_test/test_lib

main.go 를 install 한다.

root:~/go/src/kojh_test/test_main> go install kojh_test/test_main

실행해 본다.

root:~/go/bin> ./test_main
This is from MyLibTest in test_lib

참고

https://golang.org/doc/gopath_code

https://blog.golang.org/go116-module-changes