Go mod 사용

go modules골 랑 1.11 에 새로 추 가 된 특성 입 니 다.지금 1.12 가 발표 되 었 으 니 쓸 때 가 되 었 다.Modules 공식 정의:
모듈 은 관련 Go 패키지 의 집합 입 니 다.modules 는 소스 코드 교환 과 버 전 제어 장치 입 니 다.go 명령 은 다른 모듈 에 대한 의존 도 를 기록 하고 해석 하 는 modules 를 직접 지원 합 니 다.modules 는 주어진 빌 드 에 어떤 원본 파일 을 사용 할 지 지정 하기 위해 GOPATH 기반 의 오래된 방법 을 대체 합 니 다.
Modules 를 어떻게 사용 합 니까?
  • 골 랑 을 1.11 로 업그레이드(현재 1.12 가 발표 되 었 으 니 1.12 를 사용 하 는 것 을 권장 합 니 다)
  • 설치GO111MODULE
  • GO111MODULE GO111MODULE세 가지 값 이 있 습 니 다.off,onauto( ).
  • GO111MODULE=offgo 명령 행 은 module 기능 을 지원 하지 않 습 니 다.가방 에 의존 하 는 방식 을 찾 는 것 은 오래된 버 전 으로 vendor 디 렉 터 리 나 GOPATH 모드 를 통 해 찾 을 수 있 습 니 다.
  • GO111MODULE=ongo 명령 길드 는 modules 를 사용 하고 GOPATH 디 렉 터 리 에서 찾 지 않 습 니 다.
  • GO111MODULE=auto기본 값,go 명령 줄 은 현재 디 렉 터 리 에 따라 module 기능 을 사용 할 지 여 부 를 결정 합 니 다.이런 상황 에서 두 가지 상황 으로 나 눌 수 있다.
  • 현재 디 렉 터 리 는 GOPATH/src 외 에 고 모드 파일
  • 을 포함 하고 있 습 니 다.
  • 현재 파일 은 go.mod 파일 을 포함 하 는 디 렉 터 리 아래 에 있 습 니 다.


  • modules 기능 이 활성화 되 었 을 때 가방 에 의존 하 는 저장 위치 가 변경 되 었 습 니 다.$GOPATH/pkg같은 패키지 여러 버 전이 병존 할 수 있 고 여러 항목 이 캐 시 모듈 을 공유 할 수 있 습 니 다.
    go mod
    골 랑 은 가방 을 관리 하 라 는 명령 을 내 렸 다.
    go mod 는 다음 명령 이 있 습 니 다:
    명령 하 다.
    설명 하 다.
    download
    로 컬 캐 시 에 모듈 다운로드(의존 패키지 다운로드)
    edit
    도구 나 스 크 립 트 에서 go.mod 편집(go.mod 편집)
    graph
    print 모듈 requirement graph(인쇄 모듈 의존 도)
    init
    initialize new module in current directory(현재 디 렉 터 리 에서 mod 초기 화)
    tidy
    add missing and remove unused modules(부족 한 모듈 을 끌 어 내 고 사용 하지 않 는 모듈 을 제거 합 니 다)
    vendor
    make vendored copy of dependencies(vendor 에 의존)
    verify
    dependencies 가 예상 한 콘 텐 츠 가 있 는 지 확인(의존 도가 올 바른 지 검증)
    why
    패키지 나 모듈 이 필요 한 이 유 를 설명 합 니 다(왜 의존 해 야 하 는 지 설명 합 니 다)
    프로젝트 에서 어떻게 사용 합 니까?
    예제 1:새 항목 만 들 기
  • go mod에 디 렉 터 리 를 새로 만 들 고GOPATH 생 성 초기 화go mod init파일
  • 을 사용 합 니 다.
    ➜  ~ mkdir hello
    ➜  ~ cd hello
    ➜  hello go mod init hello
    go: creating new go.mod: module hello
    ➜  hello ls
    go.mod
    ➜  hello cat go.mod
    module hello
    
    go 1.12

    go.mod 파일 이 생 성 되면 그 내용 은 go toolchain 에 의 해 전면적으로 통 제 됩 니 다.go toolchain 은 각종 명령 이 실 행 될 때,예 를 들 어 go get,go build,go mod 등 이 go.mod 파일 을 수정 하고 유지 합 니 다.
    go.mod 는go.mod,module,requirereplace네 가지 명령 을 제공 했다.
  • exclude문구 지정 가방 의 이름(경로)
  • module문구 가 지정 한 의존 항 모듈
  • require문 구 는 의존 항 모듈
  • 을 교체 할 수 있다.
  • replace문 구 는 의존 항 모듈
  • 을 무시 할 수 있다.
  • 의존 추가
  • server.go 파일 을 새로 만 들 고 다음 코드 를 기록 합 니 다.
    package main
    
    import (
        "net/http"
        
        "github.com/labstack/echo"
    )
    
    func main() {
        e := echo.New()
        e.GET("/", func(c echo.Context) error {
            return c.String(http.StatusOK, "Hello, World!")
        })
        e.Logger.Fatal(e.Start(":1323"))
    }

    실행exclude코드 를 실행 하면 go mod 가 자동 으로 찾 아 자동 다운로드 에 의존 하 는 것 을 발견 할 수 있 습 니 다.
    $ go run server.go
    go: finding github.com/labstack/echo v3.3.10+incompatible
    go: downloading github.com/labstack/echo v3.3.10+incompatible
    go: extracting github.com/labstack/echo v3.3.10+incompatible
    go: finding github.com/labstack/gommon/color latest
    go: finding github.com/labstack/gommon/log latest
    go: finding github.com/labstack/gommon v0.2.8
    #        
    ...
    
       ____    __
      / __/___/ /  ___
     / _// __/ _ \/ _ \
    /___/\__/_//_/\___/ v3.3.10-dev
    High performance, minimalist Go web framework
    https://echo.labstack.com
    ____________________________________O/_______
                                        O\
    ⇨ http server started on [::]:1323

    현재 go.mod 내용 보기:
    $ cat go.mod
    
    module hello
    
    go 1.12
    
    require (
        github.com/labstack/echo v3.3.10+incompatible // indirect
        github.com/labstack/gommon v0.2.8 // indirect
        github.com/mattn/go-colorable v0.1.1 // indirect
        github.com/mattn/go-isatty v0.0.7 // indirect
        github.com/valyala/fasttemplate v1.0.0 // indirect
        golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
    )

    go module 패 키 지 를 설치 하 는 원칙 은 최신 release tag 를 먼저 당 기 는 것 입 니 다.tag 가 없 으 면 최신 commt 를 당 기 는 것 입 니 다.자세 한 내용 은 Modules 공식 소개 참조.go 는 dependency tree 를 기록 하기 위해 go.sum 파일 을 자동 으로 생 성 합 니 다.
    $ cat go.sum
    github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
    github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
    github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=
    github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
    github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
    github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
    ...      
  • 스 크 립 트 재 실행go run server.go검사 및 설치 의존 절 차 를 건 너 뛰 었 습 니 다.
  • 업그레이드 가능 한 패 키 지 를 명령go run server.go으로 검사 할 수 있 습 니 다.go list -m -u all업그레이드 후 새로운 의존 버 전 을 go.mod 로 업데이트 합 니 다.
  • 도 사용 가능go get -u need-upgrade-package모든 의존 도 업그레이드

  • go get 업그레이드
  • go get-u 를 실행 하면 최신 부차적인 버 전이 나 수정 버 전(x.y.z,z 는 수정 버 전 번호,y 는 부차적인 버 전 번호)
  • 으로 업 그 레이 드 됩 니 다.
  • go get-u=patch 를 실행 하면 최신 버 전
  • 으로 업 그 레이 드 됩 니 다.
  • go get 실행package@version지정 한 버 전 번호 version
  • 으로 업 그 레이 드 됩 니 다.
  • go get 을 실행 합 니 다.버 전의 변경 이 있 으 면 go.mod 파일 도 변 경 됩 니 다
  • 예시 2:기 존 프로젝트 개조(helloword)
    항목 디 렉 터 리:
    $ tree
    .
    ├── api
    │   └── apis.go
    └── server.go
    
    1 directory, 2 files

    server.go 소스 코드:
    package main
    
    import (
        api "./api"  //           
        "github.com/labstack/echo"
    )
    
    func main() {
        e := echo.New()
        e.GET("/", api.HelloWorld)
        e.Logger.Fatal(e.Start(":1323"))
    }

    api/apis.go 소스 코드:
    package api
    
    import (
        "net/http"
    
        "github.com/labstack/echo"
    )
    
    func HelloWorld(c echo.Context) error {
        return c.JSON(http.StatusOK, "hello world")
    }
  • 사용go get -ugo.mod 초기 화
  • $ go mod init helloworld
    go: creating new go.mod: module helloworld
  • 운행go mod init ***
  • go: finding github.com/labstack/gommon/color latest
    go: finding github.com/labstack/gommon/log latest
    go: finding golang.org/x/crypto/acme/autocert latest
    go: finding golang.org/x/crypto/acme latest
    go: finding golang.org/x/crypto latest
    build command-line-arguments: cannot find module for path _/home/gs/helloworld/api

    우선 설치 의존 도 를 찾 고 다운로드 한 다음 스 크 립 트go run server.go를 실행 합 니 다.오류 가 발생 합 니 다.
    build command-line-arguments: cannot find module for path _/home/gs/helloworld/api

    하지만server.go업데이트:
    $ cat go.mod
    module helloworld
    
    go 1.12
    
    require (
            github.com/labstack/echo v3.3.10+incompatible // indirect
            github.com/labstack/gommon v0.2.8 // indirect
            github.com/mattn/go-colorable v0.1.1 // indirect
            github.com/mattn/go-isatty v0.0.7 // indirect
            github.com/valyala/fasttemplate v1.0.0 // indirect
            golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
    )

    그런데 왜 이 잘못 을 던 졌 을 까?
    이 는 server.go 에서 internal package 를 사용 하 는 방법 이 이전 과 다 르 기 때 문 입 니 다.go.mod 는 같은 작업 디 렉 터 리 에 있 는 모든 package 를 스 캔 하고go.modhelloworld 를 경로 의 접두사 로 해 야 하기 때 문 입 니 다.즉,import helloworld/api 로 써 야 합 니 다.기 존 GOPATH/dep 모드 에서 허용 되 었 던 import./api 가 효력 을 잃 었 습 니 다.자세 한 내용 은 이 issue 를 볼 수 있 습 니 다.
  • 낡은 패키지 import 방식 업데이트
  • 그래서 server.go 는 다음 과 같이 고 쳐 야 합 니 다.
    package main
    
    import (
        api "helloworld/api"  //           
        "github.com/labstack/echo"
    )
    
    func main() {
        e := echo.New()
        e.GET("/", api.HelloWorld)
        e.Logger.Fatal(e.Start(":1323"))
    }
    :golang 1.11 에서 go mod 를 사용 하기 시 작 했 습 니 다. 이런 오 류 는 이러한 1.12 로 업그레이드 해 야 하 는 문제 에 부 딪 히 면 골 랑 1.12 를 직접 업그레이드 하면 됩 니 다.다행히 1,12 발표 후에 시 도 했 어 요.go build github.com/valyala/fasttemplate: module requires go 1.12 ‍♂️
  • 여기까지 새로운 프로젝트 를 만 드 는 것 과 다 를 것 이 없다
  • 직접 가 져 올 수 없 는 package 를 replace 로 교체 합 니 다.
    일부 알려 진 원인 으로 인해 모든 패키지 가 성공 적 으로 다운로드 되 는 것 은 아 닙 니 다.예 를 들 어go mod아래 의 가방 입 니 다.
    modules 는 go.mod 파일 에서 replace 명령 을 사용 하여 github 에 대응 하 는 라 이브 러 리 로 바 꿀 수 있 습 니 다.예 를 들 어:
    replace (
        golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
    )

    혹은
    replace golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a

    참조 링크
  • Modules 공식 소개
  • Golang 1.11 새로운 기능 소개–Modules
  • What are Go modules and how do I use them?
  • go mod doesn't work for github.com/gomarkdown/markdown/html
  • go modules 재 탐색:사용 과 디 테 일
  • Go module
  • References
    [1]Modules 공식 소개:https://github.com/golang/go/...[2] issue: https://github.com/golang/go/...[3]이런 오류:https://github.com/golang/go/...[4]Modules 공식 소개:https://github.com/golang/go/...[5]Golang 1.11 새로운 기능 소개–모듈:https://www.lightblue.asia/go...[6] What are Go modules and how do I use them?: https://talks.godoc.org/githu...[7] go mod doesn't work for github.com/gomarkdown/markdown/html : https://github.com/golang/go/...[8]go modules 재 탐색:사용 및 세부 사항:https://www.cnblogs.com/apoce...[9]Go 모듈 을 처음 본다:https://tonybai.com/2018/07/1...
    마지막 으로 여자친 구 의 지지 와 포용 에 감 사 드 립 니 다.❤️
    다음 키 워드 를 입력 하여 과거 기록 을 얻 을 수 있 습 니 다:golang.org| & |

    좋은 웹페이지 즐겨찾기