본문 바로가기
Web Development/GO(GOLANG)

[GO / GOLANG] go.mod와 GOPATH(GO111MODULE)에 대한 이해 (feat. go.mod file not found in current directory or any parent directory)

by 감자맹고우 2022. 4. 1.
728x90
반응형

최근 블록체인에 대한 관심이 생기면서 GO 언어를 조금씩 건들여보고 있다.

구글링을 할 때는 검색 편의를 위해 GOLANG으로 많이 검색하는데, 위키에 적힌 GOLANG 의 역사부터 특징까지 모두 읽어보니 상당히 흥미로웠다.

 

특징은, 각 언어의 편의성을 한데 모아둔 것 같은 느낌?

Java의 가비지 컬렉션을 갖추었고, C++의 특성과 비슷하지만 Python 처럼 코드의 간결성과 즉흥성을 추구하고 있다.

특히, C++부터 Java, Python까지 모두 코드를 작성해보았던 경험이 있었기에 언어의 특징을 생각하면서 읽으니 재밌기도 했다.

 

그래서, 언어의 모든 시작점인 hello world 코드를 바로 작성해보기로 했다.

우선은 정기결제로 끊어 둔 IntelliJ가 있어 GO 플러그인을 설치해 실행해보았다.

 

package main

import "fmt"

func main() {
	fmt.Println("Hello World!")
}

 

package는 사용자가 go확장자 파일로 설정한 이름이다.

위의 코드의 경우 main.go에 작성한 코드임을 알 수 있다.

 

코드가 정말 간결한데 func main()으로 메인 함수를 작성해서 실행하면 된다.

fmt의 경우 자동완성 시 바로 import 되는 것도 확인할 수 있다.

바로 build해서 실행해보았다.

 

 

하지만, 곧 이어 발생하는 에러 메시지

 

Error running 'go build hello': Cannot run program : CreateProcess error=216, %1의 버전이 실행 중인 Windows 버전과 호환되지 않습니다. 컴퓨터의 시스템 정보를 확인하고 소프트웨어 게시자에게 문의하십시오

 

아니 이제 시작인데 벌써 무슨 에러야... 라고 생각했지만, 대충 버전이 호환되지 않아서 발생했다는 것을 직관적으로 알려주고 있어서 불평 없이 32비트 버전도 받아보고(컴퓨터가 64비트긴 한데) 여러가지 방법을 써보았다.

그러나 해결은 되지 않았고, 다운그레이드 해야만 해결이 될 것 같았는데, 계속 업데이트될 GOLANG을 벌써 다운그레이드해서 쓰고 싶진 않았다.

 

 

결국, VS Code로 IDE를 바꿔보기로 했고 동일하게 작성했다.

그러나 또 에러가 발생했다.

 

go: go.mod file not found in current directory or any parent directory; see 'go help modules'

 

황당했지만, go.mod 파일을 찾을 수 없다는 뜻이었고 무료인 VS Code로 GO를 쓰는 사람이 많을거라고 생각했기에 이 에러는 해결방법이 있을 것이라고 예감했다.

 

반응형

 

[ 해결 방법 ]

 

역시나, 해결 방법은 있었다.

 

1. GO111MODULE 설정 (on / off / auto[default])

 

go env -w GO111MODULE=off

 

우선 IntelliJ 에러가 떴을 때 구글링을 하면서 보았던 설정이다.

다른 에러로 검색 결과가 떠있기도 했고, 설정을 수동으로 건드는 방식이라 적용하지 않으려고 했다.

 

그러나 개인적인 생각으로, 이것은 반은 맞고 반은 틀린 방식이라고 생각한다.

이유는 아래에서 설명하겠다.

 

 

2. go.mod 파일 생성

 

go mod init

 

터미널에서 이 명령어를 입력하면 go.mod 파일을 생성해준다.

내 경우에는 go.mod 파일이 바로 생성되지 않고 추가로 이런 문구가 나왔다.

go: cannot determine module path for source directory {소스 폴더 경로} (outside GOPATH, module path must be specified)
Example usage:
        'go mod init example.com/m' to initialize a v0 or v1 module
        'go mod init example.com/m/v2' to initialize a v2 module 

 

go mod init 뒤에 module path가 명확하게 설정이 되어야 한다는 뜻인 것 같다.

그러나 나는 hello world만 출력하면 되기에 예제와 동일하게 example.com/m 부분을 그대로 작성했다.

그랬더니 아래와 같이 go.mod 파일이 생성되었다.

 

 

 

go.mod 파일 내부 코드는 다음과 같았다.

 

//go.mod

module example.com/m
go 1.18

 

파일 내부를 보는 순간 모든 것이 이제 이해되었다.

go.mod는 사실 NodeJS의 package.json, Spring의 pom.xml과 같은 필수 설정 파일이었던 것이다.

 

그런 파일을 만들어주지 않았으니 정상 동작될리가 있나, 그런데 왜 처음부터 자체적으로 만들어주지 않는거지? 라는 생각이 들었다. 그 답은 나무위키에 있었다.

 

2018년 8월에 발표된 1.11 버전에서 모듈이라는 패키지 관리 기능이 추가되었다. 그동안 약점이었던 패키지 버전 관리가 해결되었다. 그 대신 Windows XP와 Windows Vista를 더이상 지원하지 않는다.

1.16 버전부터 GOPATH가 먹히지 않는다. 모듈이 기본 옵션이 되어(GO111MODULE이 on), GO111MODULE 환경변수를 auto나 off로 하면 GOPATH를 사용할 수 있다. 1.17부터 모듈만 지원할 계획이었으나, go.mod가 있으면 모듈 없으면 gopath를 사용한다. 어쨌든 GOPATH와 non-modular 구조는 deprecated이므로 모듈 구조를 사용하는 것이 권장된다.

 

내용은 결국 다음과 같다.

1. 1.11 버전부터 의존성 관리, 패키지 관리 기능이 추가되었다.
2. 1.16 버전부터 go.mod를 GOPATH 대신 디폴트로 사용하도록 한다.
3. 현재까지는 go.mod와 GOPATH를 사용하는 방식을 옵션 설정을 통해 모두 이용 가능하지만, go.mod가 권장된다.

 

원래 GOLANG은 GOPATH라는 파일을 직접 건들여 여러가지 설정을 했지만, 패키지 관리 기능을 보완하면서 package.json이나 pom.xml과 같이 go.mod라는 모듈러 파일을 통해 대체하려고 하는 것 같다.

하지만, 아직 기존 GOPATH 를 이용하는 방식을 완전히 없애진 않고 옵션을 따로 설정해 사용할 수 있도록 해주었고,

이후에 버전이 업그레이드 되어감에 따라 GOPATH 방식이 사용되지 않으면, go.mod 파일도 자동 생성이 되도록 지원해줄 것 같다.

 

그렇기에 deprecated된 GOPATH 방식을 계속 사용하는 GO111MODULE 설정 을 통한 방식은 반은 맞고 반은 틀리다고 표현한 것이다.

 

아무튼, 이렇게 자세한 사항을 알 수 있었고, 이제는 결과를 볼 차례이다.

역시나 go.mod 파일이 생성된 후 실행시켰더니 정상적으로 Hello World!가 출력되는 것을 확인할 수 있었다!

 

 

※ p.s. IntelliJ의 오류는 go.mod 파일이 자동 생성되기에 솔직히 아직 잘 모르겠지만, 버전 문제로 보이고 버전을 다운그레이드하던지 그냥 GOLAND를 쓰는 것도 괜찮을 것 같다.

 

🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱‍🏍

 

728x90
반응형

댓글