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