Tutorial: 멀티 모듈 워크스페이스 시작하기
Tutorial: 멀티 모듈 워크스페이스 시작하기
여러 개의 모듈을 한꺼번에 개발하면서 그 사이를 오가며 빌드하고 싶을 때가 있어요. 예를 들어 내가 만든 모듈이 다른 로컬 모듈에 의존하는 상황이라면, 매번 의존 모듈을 게시(release)하기 전에도 서로의 변경을 반영하며 확인할 수 있으면 좋겠죠. Go의 멀티 모듈 워크스페이스가 바로 그런 시나리오를 위한 기능이에요.
두 개의 모듈 만들기
먼저 워크스페이스 디렉터리를 만들고 그 안에 hello 모듈을 만들어요. 이 모듈은 golang.org/x/example/hello/reverse 패키지에 의존할 예정이에요.
mkdir workspace
cd workspace
mkdir hello
cd hello
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
$ go get golang.org/x/example/hello/reverse
hello.go 파일에 reverse.String을 호출하는 코드를 넣어요.
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"))
}
실행하면 문자열이 뒤집힌 olleH가 출력돼요.
$ go run .
olleH
go.work 파일로 워크스페이스 초기화하기
이제 워크스페이스 디렉터리로 나가 go work init을 실행해 워크스페이스에 hello 모듈을 포함시켜요.
$ go work init ./hello
go work init은 ./hello 디렉터리의 모듈을 담는 워크스페이스용 go.work 파일을 만들어 줘요. 생성된 파일은 이렇게 생겼어요.
go 1.18
use ./hello
go.work 파일은 go.mod와 비슷한 문법을 써요. go 지시자는 이 파일을 해석할 Go 버전을, use 지시자는 hello 디렉터리의 모듈을 빌드 시 메인 모듈로 취급하라는 뜻이에요. 이제 워크스페이스 디렉터리 어디서든 해당 모듈이 활성화돼요.
$ go run ./hello
olleH
워크스페이스에 포함된 모든 모듈은 메인 모듈로 취급돼서, 모듈 바깥에서도 그 모듈의 패키지를 참조할 수 있어요.
의존 모듈을 로컬에 내려받아 수정하기
이제 golang.org/x/example/hello 모듈을 워크스페이스에 추가해 볼게요. 먼저 Git 저장소를 clone 해요.
$ git clone https://go.googlesource.com/example
그다음 그 모듈을 워크스페이스에 추가해요.
$ go work use ./example/hello
이제 go.work 파일은 두 모듈을 모두 포함해요.
go 1.18
use (
./hello
./example/hello
)
reverse 패키지에 숫자를 뒤집는 새 함수 Int를 추가해 볼게요. workspace/example/hello/reverse/int.go 파일을 만들고 다음을 넣어요.
package reverse
import "strconv"
// Int returns the decimal reversal of the integer i.
func Int(i int) int {
i, _ = strconv.Atoi(String(strconv.Itoa(i)))
return i
}
그리고 hello.go를 수정해 새 함수를 호출해요.
package main
import (
"fmt"
"golang.org/x/example/hello/reverse"
)
func main() {
fmt.Println(reverse.String("Hello"), reverse.Int(24601))
}
실행하면 결과가 이렇게 나와요.
$ go run ./hello
olleH 10642
이렇게 같은 워크스페이스 안에 두 모듈이 있으면, 한 모듈의 변경을 곧장 다른 모듈에서 반영해 확인할 수 있어요. go.work는 여러 모듈을 넘나들며 작업할 때 go.mod의 replace 지시자를 쓰는 대신 사용할 수 있는 방법이에요.
실제 배포를 위해 모듈을 릴리스해야 한다면, 보통 버전 컨트롤 저장소에 커밋을 태깅해 v0.1.0 같은 버전을 만들고, hello/go.mod의 요구 버전을 올리는 방식의 module release workflow를 따라요.