Go 1.18 Changes - Workspace

0xf4d3c0d3·2022년 3월 20일
0

2022/03/15 Go 1.18 버전이 릴리즈 되었다. 크게 Workspace, Fuzzing, Generics가 소개되었으며, 이번 글에서는 Workspace를 살펴본다.

Workspace가 무엇인가? Go blogRelease Notes에서 다음과 같은 설명들을 찾을 수 있었다:

The go command now supports a "Workspace" mode. If a go.work file is found in the working directory or a parent directory, or one is specified using the GOWORK environment variable, it will put the go command into workspace mode. In workspace mode, the go.work file will be used to determine the set of main modules used as the roots for module resolution, instead of using the normally-found go.mod file to specify the single main module.

In Go 1.18, we’ve addressed this with a new Go workspace mode, which makes it simple to work with multiple modules.

여러 모듈들을 다룰 때 쓰는걸로 보이는데 정확히 뭔지 아직 잘 모르겠다.
마침 공식 튜토리얼이 있으니 한번 해보자.

hello 디렉토리에 아래와 같은 hello.go를 작성한다:

package main

import (
    "fmt"

    "golang.org/x/example/stringutil"
)

func main() {
    fmt.Println(stringutil.Reverse("Hello"))
}

그리고 go run example.com/hello로 확인해주자.

이제 workspace의 시간이다.

workspace 디렉토리로 돌아와 go work init hello를 해주면 go.work라는 이름의 파일이 생성되며 그 내용은 위와 같다. go directive는 어떤 버전의 Go를 사용할 것인지, use directive는 빌드 시 어떤 모듈을 메인으로 할것인지를 명시한다. 따라서 workspace 아래 모든 하위 디렉토리들의 모듈들도 영향을 받는다.

workspace 디렉토리에서 go run example.com/hello를 해보면 잘 실행된다. workspace 내 모든 모듈들이 main module 취급되기 때문이다. 덕분에 모듈 밖에서도 해당 모듈의 패키지를 참조할 수 있다. go.work를 잠시 비활성화 하고 다시 확인해보면 example.com/hello 모듈을 찾을 수 없다는 에러를 볼 수 있다.

다음으로 workspace에 golang.org/x/example 모듈의 로컬 복사본을 추가한 뒤 stringutil 패키지에 새로운 함수를 추가하겠다.

clone한 example 모듈을 go work use로 추가해주면 go.work에도 반영되는것을 볼 수 있다. 이제 go get으로 받은 버전의 stringutil 대신 우리가 수정한 버전의 코드를 사용할 수 있게 되었다.

workspace/example/stringutil 아래 to_upper.go 파일에 다음과 같이 ToUpper 함수를 구현하자.

package stringutil

import "unicode"

// ToUpper uppercases all the runes in its argument string.
func ToUpper(s string) string {
    r := []rune(s)
    for i := range r {
        r[i] = unicode.ToUpper(r[i])
    }
    return string(r)
}

그리고 workspace/hello 아래 hello.go 파일에 Reverse를 새로 만든 ToUpper로 바꿔준 뒤 go run example.com/hello를 해주면 수정된 버전의 stringutil이 잘 반영되었음을 확인할 수 있다.

여기서 go.work가 없었으면 example.com/hello가 무엇인지, 어떤 golang.org/x/example을 써야 하는지 알 수 없었을 것이다. 또는 redirect directive를 사용해 동일한 효과를 낼 수 있다고 하는데, workspace가 더 편해보인다.

0개의 댓글