Programming/Go

GO언어 의존성 패키지 관리 Go Module편

KayEsQuo 2021. 5. 21. 15:37

시작하기에 앞서..

보통 의존성 관리는 내장함수패키지(GoRoot) 써드파티패키지(GoPath) 로컬 패키지(사용자 지정)를 통해 관리된다. 그러나 이러한 패키지 관리는 다른사람과 협업하거나 다른 PC에서 프로젝트를 진행해야 할 때 의존성패키지를 직접 다시 설치해야하는 번거로움이 발생한다. 이를 해결하기 위한 의존성 관리 도구인 dep과 Go module이 있고, 이글에서는 Go Module에 대해 다룰 것이다. 주요 핵심 내용은 빌드를 하기 위한 사용법에 관해 설명 할것이며, 원리나 자세한 내용은 추후 추가로 글작성을 할 예정이다.

빌드(build)

빌드에 실행 조건인 main으로는 아래의 그림과 같고, 실행하고자하는 main에서 필요한 의존성 라이브러리는 zap 이다.

실행하고자 하는 코드를 빌드를 하기 위해서 2가지 방법이 있고, 이 글에서는 실행방법A(vendor)와 실행방법B(tidy)를 그림과 같이 설명한다. 둘의 차이점은 의존성패키지가 명령어를 실행한 해당폴더에 의존성 패키지가 존재유무로 나뉘게 된다.

 

package main

import (
	"encoding/json"
	"log"

	"go.uber.org/zap"
)

func main() {
	rawJSONConfig := []byte(`{
      "level": "info",
      "encoding": "console",
      "outputPaths": ["stdout", "/tmp/logs"],
      "errorOutputPaths": ["/tmp/errorlogs"],
      "initialFields": {"initFieldKey": "fieldValue"},
      "encoderConfig": {
        "messageKey": "message",
        "levelKey": "level",
        "nameKey": "logger",
        "timeKey": "time",
        "callerKey": "logger",
        "stacktraceKey": "stacktrace",
        "callstackKey": "callstack",
        "errorKey": "error",
        "timeEncoder": "iso8601",
        "fileKey": "file",
        "levelEncoder": "capitalColor",
        "durationEncoder": "second",
        "callerEncoder": "full",
        "nameEncoder": "full",
        "sampling": {
            "initial": "3",
            "thereafter": "10"
        }
      }
    }`)

	config := zap.Config{}
	if err := json.Unmarshal(rawJSONConfig, &config); err != nil {
		panic(err)
	}
	logger, err := config.Build()
	if err != nil {
		panic(err)
	}

	logger.Debug("This is a DEBUG message")
	logger.Info("This should have an ISO8601 based time stamp")
	logger.Warn("This is a WARN message")
	logger.Error("This is an ERROR message")
	defer logger.Sync()
	undo := zap.RedirectStdLog(logger)
	defer undo()
}

실행방법A

실행 명령어는 3가지로 아래와 같다.

go mod init => go mod tidy => go build

 

 

A-1. go mod init(초기화)

 

 

 

A-2. go mod tidy(의존성 패키지 설치)

프로젝트와 관련된 의존성 패키지를 설치한다.

 

A-3 go build(빌드)

 

 

실행방법B

go mod init => go mod vendor => go build

B-1. go mod init(초기화)

 

 

B-2. go mod vendor (의존성 패키지 설치)

프로젝트와 관련된 의존성 패키지를 설치하고, 의존성 package는 vendor폴더에 

위치한다.

 

B-3 go build(빌드)

 

에러 & 예외사항

보통 프로젝트 크기가 커져서 많은 의존성을 지니게 될때 go module의 의존성 경로를 제대로 찾지 못하거나 해당 local path에 직접 go.mod를 생성하라는 에러문을 확인할 수 있다. 보통 vscode로 코드를 저장할때 자동 import로 잘못된(중복 코드 호출은 가능함) 경로를 가져오는 경우가 있다. 이때 go.mod를 폴더마다 직접 생성하여 go.mod끼리 의존성을 직접 설정하기보다 local package import 경로를 제대로 확인하여 해결하는 것을 추천한다. 한프로젝트폴더 당 한개씩의 go.mod, go.sum으로 의존성연결이 가능하다.

끝으로

이번 글은 빌드를 하기 위한 것에 초점을 맞춰서 글작성을 하였다. 앞서 언급한대로 go.sum과 go.mod , vendor에 대해 글을 작성해 나갈것이다. 또한 go언어 2020년도 이후로 go module이 많이 사용되지만, 또다른 의존성 관리 도구인 dep에 대해서도 다룰 예정이다.