Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Go 환경 설정(with go1.15.7)

3년 전에 Go 환경 설정에 대한 글을 썼다. 당시 Go 언어를 사용해야 했기에 쓴 글이었지만 사실 Go 언어를 그리 많이 쓰진 않았고 언어를 잘 배우는 편은 아니어서 그랬는지 몇 개월 뒤에 나는 Elctron 데스크톱 앱 개발로 도망쳤다. 그래서 여전히 Go 언어에 대해서는 잘 알지 못한다.

인프라 쪽을 계속하다 보니 Go를 해야겠다는 생각이 계속 들어서 다시 Go 언어를 만지게 됐다. 이전에 글을 썼을 때는 여러 의존성 관리 도구가 있던 시기에 막 go modules가 등장했을 때였던 걸로 기억하는데 지금은 go modules가 평정한 것 같아서 이전과 뭐가 달라졌나(라고 하기엔 이전에 어땠는지도 잘 모르지만...) 확인도 할 겸 앞으로도 사용해야 해서 다시 Go 언어의 개발환경을 설정했다.

나는 주로 사용하는 도구를 바이너리로 받아서 PATH에 넣어서 관리하는 편이라(버전 관리 도구를 사용하지 않고 원할 때 명시적으로 버전을 변경하려고...) 다운로드 페이지에서 pkg 대신 tar.gz 파일을 받아서 PATH 경로에 바이너리 파일을 넣었다.

$ go version
go version go1.15.7 darwin/amd64

사실 전에 사용할 때는 자꾸 환경변수 지정하라고 해서 좀 피곤했는데 이젠 환경변수를 지정하지 않고도 크게 무리 없이 사용할 수 있었다.

그사이에 뭐가 달라졌는지 잘 모르기 때문에 Tutorial: Get started with Go를 따라 해봤다.

프로젝트 디렉터리를 만들고 hello.go 파일에 다음 내용을 입력한다.

package main

import "fmt"

func main() {
  fmt.Println("Hello, World!!")
}

이 코드를 다음과 같이 실행할 수 있다.

$ go run .
Hello, World!!

이제 외부 패키지 rsc.io/quote를 사용하는 예제를 이어서 따라 해 보자. hello.go 파일을 다음과 같이 수정한다.

package main

import "fmt"

import "rsc.io/quote"

func main() {
  fmt.Println(quote.Go())
}

외부 모듈을 사용하고 있으므로 의존성 정보를 저장하고 있는 파일인 go.mod 파일을 생성하기 위해 go mod init [module]을 실행한다.

$ go mod init hello
go: creating new go.mod: module hello

그리고 실행하면 다음과 같이 외부 모듈을 다운로드받고 실행하는 것을 볼 수 있다.

$ go run .
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
Don't communicate by sharing memory, share memory by communicating.

go.mod 파일이 없는 상태에서 실행하면 다음과 같은 오류가 발생한다.

go run .
hello.go:5:8: cannot find package "rsc.io/quote" in any of:
  /Users/outsider/bin/lib/go/go1.15.7/src/rsc.io/quote (from $GOROOT)
  /Users/outsider/go/src/rsc.io/quote (from $GOPATH)

여기서 생성된 go.mod 파일은 다음과 같은 내용을 담고 있다.

module hello

go 1.15

require rsc.io/quote v1.5.2

그리고 go run . 이후에 생긴 go.sum 파일은 다음과 같이 생겼다.

golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

위에서 패키지를 다운로드 받았는데 이는 GOPATH 아래 다운로드가 되는데 별도로 GOPATH를 지정하지 않았기 때문에 ~/go가 기본 위치가 된다.(UNIX 기준) ~/go에 가보면 pkg 폴더 아래 다운로드받은 모듈이 설치된 것을 볼 수 있다.

Waypoint 환경 설정

좀 더 실전을 위해서 최근에 관심있는 HashiCorp의 Waypoint의 개발환경을 설정해 봤다. 아직 개발을 본격적으로 한 것은 아니라서 다양한 케이스나 베스트 프랙티스에 대해서는 잘 모른다.

Waypoint의 기여 문서go-bindata가 설치되어 있어야 한다고 해서 go get -u github.com/kevinburke/go-bindata/...로 설치한다.

$ go get -u github.com/kevinburke/go-bindata/...
go: downloading github.com/kevinburke/go-bindata v3.22.0+incompatible

go-bindata$GOPATH/bin에 설치되므로 이 명령어를 사용할 수 있게 하려면 PATH$GOPATH/bin을 추가해야 한다. 설치되어 있지 않거나 PATH에 제대로 설정되어 있지 않다면 /bin/sh: go-bindata: command not found 오류가 발생한다. 의존성 설치가 되었으면 make bin을 실행해서 Waypoint를 빌드할 수 있다.

$ make bin
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./internal/assets/ceb/ceb ./cmd/waypoint-entrypoint
cd internal/assets && go-bindata -pkg assets -o prod.go -tags assetsembedded ./ceb
CGO_ENABLED=0 go build -ldflags "-s -w -X "github.com/hashicorp/waypoint/internal/version".GitCommit=$(git rev-parse --short HEAD)$(test -n "`git status --porcelain`" && echo "+CHANGES" || true) -X "github.com/hashicorp/waypoint/internal/version".GitDescribe=$(git describe --tags --always --match "v*")" -tags assetsembedded -o ./waypoint ./cmd/waypoint
go: downloading github.com/hashicorp/go-getter v1.4.1
go: downloading github.com/dustin/go-humanize v1.0.0
......
go: downloading cloud.google.com/go/storage v1.6.0

빌드가 끝나면 해당 디렉터리에 빌드된 waypoint 파일이 생성된다.

$ ./waypoint version
Waypoint v0.2.0-209-g0f5e7a41 (0f5e7a41)

이 빌드된 파일이 잘 실행되는 것을 볼 수 있다.

2021/01/26 04:12 2021/01/26 04:12