go work를 사용하기 위해 반듯이 go1.18 이상의 go가 설치되어 있어야 합니다. go의 workspace는 회사에서 다른 개발자들과 협업을 하게 되면 모듈의 의존성에 대한 문제가 종종 발생하게 됩니다. 이럴 때 이러한 문제를 해결할 수 있는 것이 바로 go의 workspace입니다. 간단한 예시를 들자면 example이라는 모듈을 현재 회사에서 사용하고 있는데 example이라는 모듈에 기능을 추가하거나 기능을 변경할 경우 협업하고 있는 다른 개발자들에게 영향을 미치게 해서는 안 되는 경우가 있습니다. 이런 경우 "go work"를 통하여 다른 개발자들에게 영향을 미치지 않고 example 모듈을 수정하고 수정된 모듈을 이용하여 프로젝트 개발을 진행할 수 있습니다.

해당 글은 아래 링크 go document문서를 기반으로 똑같이 따라 하며 진행하였으며 개인적인 생각과 설명이 추가된 내용입니다. go work에 대한 원본 및 자세한 내용을 원하신다면 아래 공식 문서를 확인하거나 "$ go help work"를 통하여 보다 정확한 정보를 확인할 수 있습니다.

go workspace 링크 https://go.dev/doc/tutorial/workspaces

 

테스트 환경 구성하기

테스트를 진행할 수 있도록 환경을 구성합니다.

$ mkdir -r ~/workspace
$ cd ~/workspace

 

모듈 초기화하기
(hello라는 프로젝트를 생성합니다.)

$ mkdir hello
$ cd hello
$ go mod init example.com/hello

 

example 모듈 가져오기
(회사에서 사용하는 모듈이 example이라고 가정합니다.)

$ go get golang.org/x/example/hello/reverse

 

코드 작성하기

~/workspace/hello/hello.go 파일을 생성하고 다음과 같이 코드를 작성합니다.

package main

import (
    "fmt"

    "golang.org/x/example/hello/reverse"
)

func main() {
    fmt.Println(reverse.String("Hello"))
}

 

작성된 코드를 실행시켜 모듈이 잘 적용된 것을 확인해 봅시다.

$ cd ~/workspace/hello
$ go run example.com/hello

# 결과 #
olleH

 

workspace 생성하기

go work 명령어를 이용하여 workspace를 생성합니다. (작업 디렉토리는 ~/workspace입니다.)

$ cd ~/workspace
$ go work init ./hello

 

위 명령어를 수행하게 되면 다음과 같이 go.work파일이 생성됩니다. 참고로 저는 go1.20를 사용하고 있습니다.

go 1.20

use ./hello

 

모듈 다운받아 작업 진행하기

이제는 협업하는 다른 개발자들에게 모듈을 수정해도 영향을 미치지 않도록 모듈을 다운받아 모듈을 수정하는 작업을 진행할 예정입니다.
저장소 복제하기 (작업 디렉토리는 ~/workspace입니다.)

$ cd ~/workspace
$ git clone https://go.googlesource.com/example

 

workspace에 모듈 추가하기

$ go work use ./example/hello

 

위 작업을 진행하면 go.work파일이 다음과 같이 수정됩니다.

go 1.20

use (
    ./hello
    ./example/hello
)

 

모듈 수정 작업 진행하기

~/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
}

 

~/workspace/hello/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

지금까지 같이 협업하는 개발자들에게 모듈 수정으로 영향을 미치지 않고 모듈을 수정하여 개발을 진행하도록 하는 workspace에 대하여 알아봤습니다.

 

마지막으로

개발을 완료하고 협업하고 있는 모든 개발자들이 github에 push 하고 merge 작업을 진행할 때 반듯이 go.work 파일이 있다면 버전을 확인 후 작업을 진행한 개발자들과 패키지 버전에 대한 논의를 진행 후 merge 작업을 진행해야 build 과정에서 패키지 버전에 대한 이슈를 예방할 수 있습니다.

'Go언어' 카테고리의 다른 글

golang version upgrade (ubuntu)  (0) 2023.07.09
vscode golang debug  (0) 2023.07.07
Ubuntu(Linux)에서 Go 재설치  (0) 2022.10.30
Go언어 interface reflect  (0) 2021.08.15
Go언어 Cron  (0) 2021.06.15

+ Recent posts