go.mod 파일 레퍼런스

go.mod 파일 레퍼런스

Go 모듈은 go.mod 파일로 정의돼요. 이 파일 하나가 모듈의 정체와 의존 관계를 담고 있어서, 모듈의 모듈 경로(module path), 지원하는 최소 Go 버전, 요구하는 다른 모듈 목록을 한눈에 보여줘요. 바뀐 내용이 많고 옵션이 꽤 있지만, 자주 쓰는 지시자 몇 개만 알아 두면 대부분의 작업이 처리돼요.

출처: go.mod file reference

go.mod 파일 예시

go mod initmodule 지시자를 비롯한 기본 골격을 만들어 줘요. 완성된 go.mod 는 아래와 같은 모양이에요.

module example.com/mymodule

go 1.14

require (
    example.com/othermodule v1.2.3
    example.com/thismodule v1.2.3
    example.com/thatmodule v1.2.3
)

replace example.com/thatmodule => ../thatmodule
exclude example.com/thismodule v1.3.0

module 지시자

module 지시자는 모듈의 모듈 경로를 선언해요. 모듈 경로는 모듈 버전과 합쳐졌을 때 모듈을 고유하게 식별하고, 모듈이 담은 모든 패키지의 import 프리픽스가 돼요.

module module-path

모듈이 v2 이상 버전이라면 모듈 경로는 메이저 버전 번호(/v2 같은)로 끝나야 해요. 실제로는 모듈 경로가 코드 저장소 위치인 경우가 많아서, 이후에 모듈을 공개하더라도 경로를 바꿀 필요가 없어요.

module example.com/mymodule
module example.com/mymodule/v2

go 지시자

go 지시자는 이 모듈이 어느 Go 버전의 의미론을 가정하고 작성됐는지를 나타내요.

go minimum-go-version

Go 1.21 이전에는 이 지시자가 권고에 가까웠다면, 지금은 필수 조건이에요. Go 툴체인이 더 새로운 Go 버전을 선언하는 모듈을 거부해요. 또 이 지시자는 언어 기능에도 영향을 줘요. 예를 들어 go 1.12인 모듈은 Go 1.13에서 도입된 1_000_000 같은 숫자 리터럴을 쓸 수 없어요.

require / replace / exclude

require는 이 모듈이 요구하는 다른 모듈과 최소 버전을 나열해요. replace는 요구하는 모듈을 다른 버전이나 로컬 디렉터리로 대체하고, exclude는 특정 버전을 제외할 때 써요.

require (
    example.com/othermodule v1.2.3
)

replace example.com/thatmodule => ../thatmodule
exclude example.com/thismodule v1.3.0

이런 지시자들은 대부분 직접 손으로 쓰기보다 go get, go mod tidy, go mod edit 같은 명령으로 관리해요. 명령이 알아서 go.mod의 요구 사항을 일관되게 유지해 주거든요.

retract — 잘못 공개된 버전 되돌리기

한 번 공개된 버전은 바꿀 수 없어요. 실수로 v1.0.0을 공개했다면 retract 지시자로 그 버전을 철회하라는 신호를 남길 수 있어요.

retract v1.0.0 // Published accidentally.
retract v1.0.1 // Contains retraction only.

go 명령은 모듈 최신 버전의 go.mod 안에 있는 retract 지시자를 읽어, 철회된 버전을 발견해요. 철회된 버전은 go list -m -versions 출력에 기본으로 나타나지 않지만, -retracted 플래그를 쓰면 볼 수 있어요.

ignore — 패턴 매칭에서 디렉터리 제외하기

ignore 지시자는 ./... 같은 와일드카드 패턴으로 패키지를 매칭할 때, 생성되거나 Go가 아닌 디렉터리를 제외하는 데 써요. 메인 모듈의 go.mod에서만 동작하고 의존 모듈의 go.mod에서는 효과가 없어요.

ignore ./node_modules
ignore generated

이 지시자는 제외한 디렉터리와 내용을 패키지 패턴에서 빼지만, 파일 트리 자체에는 그대로 남겨 둬요.

더 알아보기