레이블이 go-module인 게시물을 표시합니다. 모든 게시물 표시
레이블이 go-module인 게시물을 표시합니다. 모든 게시물 표시

golang 1.16 go.sum 에러

# go.sum 은 go.mod 에 명시된 패키지들을 다운로드 후 각 패키지를 해시값으로 표시해
# 추후 로컬 패키지가 정상인지(변조,오염되지는 않았는지) 파악하는 체크썸 파일이다.
# 가끔 go.sum 을 커밋을 하지 않는(.gitignore 에 명시해서) 경우가 있는데
# go.sum 을 커밋해 다른 동료들과 패키지 버전을 맞출 수 있도록 해야 한다.

# 빌드는 되지만 vscode 에 다음과 같은 에러 메시지가 보였다.

error while importing github.com/stretchr/testify/assert: missing go.sum entry for module providing package github.com/pmezard/go-difflib/difflib (imported by github.com/stretchr/testify/assert); to add:
go get github.com/stretchr/testify/assert@v1.6.1compiler

missing go.sum entry for module providing package github.com/tidwall/match (imported by github.com/tidwall/gjson); to add:
        go get github.com/tidwall/gjson@v1.6.0

# 필요없는 패키지를 정리(tidy)해도 에러 메시지가 발생한다.
go mod tidy

# 원인은 go 1.13 버전을 사용하다 1.16 버전으로 명시된 go.mod 를 사용해서다.
# go.sum 체크썸 확인해보니 내 로컬의 mod cache(GOPATH/pkg/mod)가 go 1.13 으로 되어 있어 문제가 됐다.
# vscode IDE 에서 go.sum 기반으로 자동으로 잘못된 부분을 에러로 표시하고 있었다.

# 현재 go 1.16 임을 확인하고
go version
go version go1.16 darwin/amd64

# 다음 명령으로 다운로드된 패키지로 로컬 캐시를 업데이트 하면 된다.
go mod download

# 참고로
# go 1.15 까지는 -mod=mod 가 디폴트였지만
# go 1.16 부터 -mod=readonly 가 디폴트로, go.mod, go.sum 를 업데이트를 위해선
# 명시적으로 (go build, go test 등 사용시) -mod=mod 를 명시해야 한다.

vscode godef 느림 현상

# vscode go extension 는 godef 툴을 설치해 함수 정의 부분을 찾을 수 있다.
# godef 커맨드라인에서 사용
# godef 는 파일에서 찾을 단어(identifier)를 offset 으로 입력받는다.
# vscode show-offset extension 을 설치하면 상태바에 offset:xxx 로 확인할 수 있다.
# time 으로 수행시간 측정, godef -t 타입정보보기, -f 파일, -o 오프셋
time godef -t -f main.go -o 2214

# 위와 같이 커맨드를 사용하며 빠르게 위치를 출력해주지만
# vscode go to definition(정의로 가기, F12)에서는 3초가 걸린다.
# godef 수동으로 설치해보자
# gomodule 사용하는 경우 다음과 같이 설치하면 $GOPATH/bin/godef 가 생긴다.
GO111MODULE=on go get -u github.com/rogpeppe/godef

# 이제 vscode 정의로 가기하면 빨리 된다.
# godef 저장소에 에 go.mod가 있어서인지 GO111MODULE=on 으로 설치하면
# 새로운 godef 바이너리가 설치되면서 조금 빨라졌다.
# 하지만 1초가 넘어가는것이 아직도 좀 느리것 같다.
time godef -t -f main.go -o 2214
godef -t -f main.go -o 2214  1.15s user 0.58s system 313% cpu 0.552
total

# 같은 이슈인것 같은데 위 방법으로 해결되지 않는 경우가 있다.
# godef 는 내부적으로 go list 사용하고 여기서 시간을 많이 잡는것 같다.
# -trace 옵션으로 trace 파일을 만들고
time godef -t -f main.go -o 2214 -trace out.trace
# http://127.0.0.1:xxxx -> Syscall blocking profile 항목을 확인해보면
go tool trace out.trace
https://github.com/rogpeppe/godef/issues/114#issuecomment-478680734

go 1.11 modules 사용하기

# go1.11 부터 지원되는 패키지지 관리자 modules 이 추가되었다.
# go modules 은 GOPATH, vendor 대신 GOPATH/pkg/mod 에 패키지를 다운로드 한다.
# go go modules 는 아직 실험단계로
# 사용하기 위해선 다음과 같이 환경변수 설정이 되어야 한다.
# 또는 매번 go 명령시 GO111MODULE=on 를 명시
GO111MODULE=on

# go modules 를 사용하면 go.mod 파일로 패키지를 명시한다.
# go.mod 생성
go mod init

# 다음 go 명령을 수행하면 go.mod 파일에
# semantic 버전으로 패키지가 명시된다.
go build
go test
go list
module example.com/m
require (
    golang.org/x/text v0.3.0
    gopkg.in/yaml.v2 v2.1.0
)

# untagged revision(Pseudo-versions) 은 다음과 같은 형식으로 생성된다.
v0.0.0-yyyymmddhhmmss-abcdefabcdef

# 빌드 필요한 전체 패키지보기
go list -m all

# go test, go build 등으로 패키지 새로 다시 받을 경우
# modules cache 와 go.sum(패키지 변경 사항 비교를 위한) 파일을 삭제해야 한다
sudo rm -rf $GOPATH/pkg/mod/cache
rm -f go.sum
go test ./...

# ./vendor 디렉토리 패키지를 사용해서 빌드하는 경우
go build -mod=vendor

# 기타 자세한 내용은 go v1.11 에서
go help modules

# go.mod 특정 버전, 커밋을 추가할때
https://golang.org/cmd/go/#hdr-Module_queries
# 다음과 같이 커밋 해시를 사용하면 해당 커밋상태를 go.mod 를 추가한다.
go get github.com/gorilla/mux@e3702bed2

# go 1.13 부터는 GO111MODULE=auto 가 디폴트로 설정되어 있다.
GO111MODULE=auto 는
현재 프로젝트가 GOPATH 안에 있으면 GO111MODULE=off
현재 프로젝트가 GOPATH 밖에 있으면 GO111MODULE=on
으로 동작한다.

# GO111MODULE=on 이면 GOPATH 가 아닌 경로에서 프로젝트(디렉토리)를 구성할 수 있다.
# GOPATH 안에 프로젝트를 만들면 자동으로 모듈명을 파악해 go.mod
# go mod init 이 다음과 같이 GOPATH 밖에 있어 모듈 경로를 명시해야 하는 경우
go: cannot determine module path for source directory /home/ysoftman/workspace/test_code/golang/wordcount (outside GOPATH, module path must be specified)

# 다음같이 모듈명을 직접 명시해야 한다.
go mod init wordcount


#####


# vscode-go extension 사용시 다음과 같이 추가해주자.
"go.toolsEnvVars": {
    "GO111MODULE": "on"
},

# vscode-go 에서 go.formatTool 로
# goimports 또는 goreturns(gofmt+goimports) 사용시 module 을 찾지 못해 import 에서 자동 삭제되는 문제가 있다.
https://github.com/Microsoft/vscode-go/issues/1532#issuecomment-402294022
# 최신 툴로 업데이트 하니 아직 미해결상태다.
go get -u golang.org/x/tools/...