고(Go)에서 go get으로 파일 제외하기? 빌드 제약으로 똑똑하게 관리하는 법!

고(Go)에서 go get으로 파일 제외하기? 빌드 제약으로 똑똑하게 관리하는 법!

핵심 요약

  • 파일을 컴파일에서 제외하고 싶다면 고(Go) 빌드 제약(build constraints) (//go:build 태그)을 사용해 보세요.

  • 빌드나 문서에 포함시키고 싶지 않은 디렉터리는 go.mod 파일을 따로 만들어서 분리할 수 있답니다.

  • 이렇게 제외된 파일들은 빌드 과정에서 -tags를 사용해 명시적으로 포함시키지 않는 한 무시된답니다.

고(Go) 언어에서는 빌드 과정에 어떤 파일들을 포함시킬지 관리하는 것이 깨끗하고 효율적인 코드베이스를 유지하는 데 아주 중요합니다.

go get 명령어는 주로 패키지를 다운로드하고 설치하는 데 사용되지만, 빌드 중에 특정 파일 포함 여부를 제어하는 것은 빌드 제약(build constraints), 다른 말로는 빌드 태그(build tags)를 통해 이루어진답니다.

이 지시어들을 사용하면 개발자는 지정된 조건에 따라 빌드에서 파일을 포함하거나 제외할 수 있습니다.

빌드 제약(Build Constraints) 이해하기

빌드 제약(build constraints)은 고(Go) 소스 파일 맨 위에 위치하는 특별한 주석으로, 빌드 과정에서 해당 파일이 언제 패키지에 포함되어야 하는지를 지시합니다.

특정 빌드 상황과 관련 없는 파일들을 제외할 때 특히 유용한데요.

마치 "이 파일은 이런 조건일 때만 사용해!"라고 알려주는 꼬리표 같은 거죠.

빌드 제약(Build Constraints) 문법

고(Go) 버전 1.17 이상에서는 빌드 제약(build constraint) 문법이 다음과 같습니다.

//go:build [조건] // 대괄호 안에는 빌드 태그나 조건을 명시합니다.




1.17 이전 버전에서는 다음 문법을 사용했습니다.

// +build [조건] // 마찬가지로 조건이나 태그를 명시합니다.




이 주석 라인들은 소스 파일의 package 선언문보다 반드시 앞에 와야 한답니다.

빌드에서 파일 제외하기

빌드에서 특정 파일을 제외하려면, 사용자 정의 빌드 태그를 정의할 수 있습니다.

예를 들어, exclude라는 태그를 사용해서 파일을 제외하고 싶다면, 파일 맨 위에 다음 줄을 추가하면 됩니다.

//go:build exclude // 이 파일은 'exclude' 태그가 활성화될 때만 빌드에 포함됩니다.




1.17 미만 버전에서는 다음과 같이 작성합니다.

// +build exclude




이 지시어가 있으면, 고(Go) 툴체인(toolchain)은 빌드 중에 exclude 태그가 명시적으로 지정되지 않는 한 해당 파일을 무시합니다.

만약 exclude 태그가 붙은 파일을 포함해서 빌드하고 싶다면 다음 명령어를 사용합니다.

go build -tags=exclude




기본적으로 -tags=exclude 플래그 없이 go build를 실행하면 이 파일들은 빌드에서 제외됩니다.

실제 사용 예시

프로덕션(production) 빌드에는 포함시키고 싶지 않은 디버깅 유틸리티가 담긴 debug.go 파일이 있다고 가정해 봅시다.

debug.go 파일 맨 위에 다음을 추가합니다.

//go:build debug // 이 파일은 'debug' 태그가 있을 때만 빌드됩니다.




프로덕션(production) 용으로 빌드할 때는 간단히 다음 명령어를 실행합니다.

go build




이 명령어는 debug.go 파일을 빌드에서 제외합니다.

디버깅 유틸리티를 포함하는 개발용 빌드를 원한다면 다음 명령어를 사용합니다.

go build -tags=debug



디렉터리 제외하기

examples와 같이 특정 디렉터리 전체를 빌드 및 문서 생성에서 제외하고 싶다면, 해당 examples 디렉터리 내부에 별도의 go.mod 파일을 만들 수 있습니다.

이 방법은 해당 디렉터리를 별개의 모듈로 취급하게 만들어, 메인 빌드 과정에 포함되지 않도록 합니다.

고(Go) 포럼(Go Forum)에서도 논의된 바와 같이, examples 디렉터리에 go.mod 파일을 추가하면 메인 모듈로부터 효과적으로 분리할 수 있답니다.

마치 "이 폴더는 우리 집이랑 다른 동네야!"라고 선언하는 것과 비슷하죠.

결론

go get 명령어는 패키지를 가져오고 설치하는 데 초점을 맞추지만, 빌드 중에 어떤 파일을 포함할지 제어하는 것은 빌드 제약(build constraints)을 통해 관리됩니다.

빌드 태그(build tags)를 효과적으로 사용하고, 예제 디렉터리 등에 별도의 go.mod 파일을 사용하는 것과 같은 프로젝트 구조화 방식을 고려하면, 고(Go)에서 깨끗하고 효율적인 빌드 프로세스를 유지할 수 있답니다.

이렇게 하면 프로젝트가 커지더라도 깔끔하게 관리할 수 있겠죠?