yoongrammer

[Go] Modules 알아보기 본문

언어/Go 언어

[Go] Modules 알아보기

yoongrammer 2020. 12. 6. 18:32
728x90

목차

    [Go] Modules 알아보기


    Go 모듈은 go 패키지들의 종속성을 관리하는 패키지 관리 시스템입니다.

     

    Go의 모듈 개념은 Go 애플리케이션 내의 종속성 문제를 처리하기 위해 도입되었습니다.

    모듈은 패키지를 트리 형식으로 저장하고 있으며, 루트 트리에는 go.mod 파일이 있습니다.

     

    저장소, 모듈 및 패키지 간의 관계는 아래와 같습니다.

    • 저장소에는 하나 이상의 Go 모듈이 포함됩니다.
    • 각 모듈에는 하나 이상의 Go 패키지가 포함되어 있습니다.
    • 각 패키지는 단일 디렉토리에 있는 하나 이상의 Go 소스 파일로 구성됩니다.
    repository
    |-- module1
    |   `-- package1
    |       `-- src1.go
    |       `-- src2.go
    |   `-- go.mod
    |   `-- package2
    |       `-- src.go
    |-- module2
    |   `-- package
    |       `--src.go
    |   `-- go.mod

     

    GO111MODULE 환경변수


    모듈 동작은 GO111MODULE 환경변수에 의해 제어됩니다.

     

    GO111MODULEon, off , auto(default) 로 설정할 수 있습니다.

     

    GO111MODULE

    • off - 빌드 중에 $GOPATH에 있는 패키지를 사용합니다.
    • on - 빌드 중에 $GOPATH 대신 모듈에 있는 패키지를 사용합니다.
    • auto - 현재 디렉터리가 $GOPATH 외부에 있고 go.mod 파일이 포함된 경우 모듈을 사용하고 그렇지 않으면 $GOPATH의 패키지를 사용합니다.

    아래 명령으로 GO111MODULE 설정을 변경할 수 있습니다.

    go env -w GO111MODULE=on

    go.mod


    go.mod는 모듈을 정의하고 종속성 정보를 저장하고 있는 파일입니다.

    이 파일을 통해 패키지들을 관리하게 됩니다.

     

    모듈은 루트 디렉터리에 하나의 go.mod 파일을 갖고 있습니다.

     

    다음은 go.mod 모듈을 정의하는 예제 파일입니다.

    $ cat go.mod
    module github.com/my/thing
    
    go 1.15
    
    require (
        github.com/some/dependency v1.2.3
        github.com/another/dependency/v4 v4.0.0
    )

    go.mod는 네 가지 키워드를 사용합니다. (module, require, replace, exclude)

    module

    module은 모듈 경로를 저장합니다.

    위에 go.mod 파일 예를 보면 첫 번째 라인에 모듈의 경로를 나타내는 module 지시자가 선언되어 있습니다.

    Go 소스 코드에서 패키지를 가져올 때, 절대 경로를 사용할 필요 없이 module에 선언되어 있는 모듈 경로를 사용하면 됩니다.

    import "github.com/my/thing/bar"

    예를 들어 모듈 안에 있는 bar 패키지를 가져온다면 위와 같이 선언해주면 됩니다.

    require

    require 는 빌드시 필요한 종속성 정보를 저장합니다.

    모듈을 사용하여 빌드하면 자동으로 필요한 패키지를 다운로드 및 설치하고 require에 패키지 경로와 버전 정보가 추가됩니다.

    replace

    replace는 모듈의 특정 버전이나, 버전 전체를 대체할 때 사용합니다. require에 의해 설정된 종속성을, => 를 통해 우측에 설정된 패키지 버전으로 대체시킵니다.

     

    빌드시 우측에 설정된 패키지 버전을 사용하게 됩니다.

    replace example.com/some/dependency => example.com/some/dependency v1.2.3

    exclude

    exclude는 패키지의 특정 버전을 사용하지 않도록 할 때 사용합니다.

    exclude example.com/some/dependency

    go.sum


    go.sum 파일은 go.mod에 종속성 정보가 추가될 때 생성됩니다.

    이 파일은 종속성 관리를 위한 암호화된 체크섬 정보를 저장하고 있고 각각의 체크섬을 확인하여 수정된 항목이 있는지 확인하는 데 사용됩니다.

    $ cat go.sum
    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZO...
    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:Nq...
    rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3...
    rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPX...
    rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/Q...
    rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9...

     

    728x90

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

    [Go] context 알아보기  (0) 2020.12.13
    [Go] Modules 사용하기  (0) 2020.12.07
    [Go] Handle, Handler , HandleFunc 이해  (0) 2020.11.26
    [Go] HTTP Server 만들기  (0) 2020.11.24
    gdlv - Go언어 디버거  (0) 2020.11.22
    Comments