gex에서 Go 프로젝트 개발 도구의 의존성 관리

7584 단어 Go

TL;DR

  • go generate에 사용된 물건과 linter 등 개발용 도구도 버전을 고정시키고 싶다

  • 사용gex 간단히 완료
  • 자신의 관리 기구(dep/Mdules에 맡기지 않음)에서 기존의 작업 흐름을 가져오는 것도 쉽다
  • 관리 도구 및 개발 도구 의존


    Go의 종속 관리 도구는 현재 광범위하게 사용되고 있습니다dep. 또한 Go1.11부터 ExperimentalModules도 사용할 수 있습니다(Modules에 관해서는 Go1.11의 modules·vgo를 시도해 보세요. - 실제 사용에서 반드시 고려해야 할 것들.라는 글에서 간단하게 소감을 썼습니다. 가능하다면 보십시오).
    이러한 의존 관리 도구는 코드import의 패키지를 잘 관리하여 버전 잠금을 진행할 수 있다.

    개발 도구 관리


    다른 한편, 개발할 때 사용하는 실행 가능한 도구는 흥미가 없다.
    흔한 예는

  • mockgen(Mok 생성)

  • statik(static 파일 포함)

  • sqlboiler(ORM 코드 생성)
  • protoc 플러그인
  • 이런 것들은 판본을 정확하게 고정시킬 수 없기 때문에 여러 가지 문제가 발생할 수 있다.
  • 팀 개발 시go generate 매번 diff
  • mockgen(코드 생성 도구) 및 mock(코드에서 사용하는 라이브러리)의 버전이 분리되어 이동할 수 없음
  • 잠깐만.

    dep의required


    우선, deprequired 설명을 통해import 도구가 없어도 관리할 수 있습니다에 관하여.
    required = [
      "github.com/golang/mock/mockgen",
    ]
    
    그러나 여기서 바이너리 파일을 올바르게 구축하고 생성하려면 3시간 정도 걸립니다.
    # `go install` でプロジェクトローカルに出力されるように `GOBIN` を書き換え
    $ export GOBIN=$PWD/bin
    
    # `PATH` を通す
    $ export PATH=$GOBIN:$PATH
    
    # ビルドする
    $ cd vendor/github.com/golang/mock/mockgen
    $ go install .
    
    이거 할 때마다 대체
    스스로 이용했다Makefiledefine.
    DEP_SRCS := \   
        github.com/golang/mock/mockgen \    
        golang.org/x/lint/golint    
    
    DEP_BINS := $(addprefix $(BIN_DIR)/,$(notdir $(DEP_SRCS)))  
    
    define dep-bin-tmpl 
    $(eval OUT := $(BIN_DIR)/$(notdir $(1)))    
    $(OUT): dep 
        @echo "--> Installing $(OUT)..."    
        @cd vendor/$(1) && GOBIN="$(BIN_DIR)" go install .  
    endef   
    
    $(foreach src,$(DEP_SRCS),$(eval $(call dep-bin-tmpl,$(src))))  
    
    그러나'도구를 추가할 때Gopkg.tomlMakefile 둘 다 기술해야 할 군더더기'와'원래Makefile는 너무 복잡해서 유지하기 어렵다'는 문제가 존재한다.

    기타 개발용 도구 관리 방법


    이 문제를 처리하는 데 쓰이는 도구가 몇 개 있다.
  • virtualgo https://github.com/GetStream/vg
  • Python의 virtualenv inspired 도구
  • retool https://github.com/twitchtv/retool
  • 자체 관리 기구 보유
  • 그러나 어느 것이든 "vendoring의 포장에서 2진법을 만들고 싶다"는 정도의 욕망 규모가 너무 크다는 인상을 준다. 또 dep와 모듈을 죽이는'다른 도구로부터migration'이 쉽다는 장점도 있다.

    gex 개발 도구 관리


    지금까지'개발용 도구의 관리'에서 원하는 것을 정리하면 다음과 같은 조건을 충족하면 된다.
  • dep 또는 Modules(자신의 관리 기구가 없음)
  • 어쨌든 간단하게 2진법만 생성하면 된다
  • 상기 조건을 만족시키는 gex 얇은 공구를 만들었다.
    예를 들어, 종속성에 mockgen 을 추가하려면 다음 명령을 수행합니다.
    $ gex --add github.com/golang/mock/mockgen
    
    mockgen를 실행하려면 gex mockgen ...처럼,add에서 직접 두드려서 $PWD/bin생성된 2진법을 사용할 수 있습니다. 또한 gex --build2진법을 다시 생성할 수도 있습니다. direnvexport PATH=$PWD/bin:$PATHMakefile도 잘 어울립니다.

    gex는 어떻게 2진법을 관리합니까


    gex는 cmd/go: clarify best practice for tool dependencies · Issue #25922 · golang/go에서 소개한 내용을 간단하게 설치했다.gex --add <path/to/cmd> 중 다음과 같은 행위가 있다.

  • 실행go get ... 또는 dep ensure -add ...

  • 실행go build -o ./bin/<cmd> <path/to/cmd>

  • 쓰기tools.go
  • tools.go 패키지blankimport의 파일일 뿐입니다.buildconstraint에 적당한 내용을 썼기 때문에 구축할 때 참조되지 않습니다.
    // Code generated by github.com/izumin5210/gex. DO NOT EDIT.
    
    // +build tools
    
    package tools
    
    // tool dependencies
    import (
            _ "github.com/golang/mock/mockgen"
    )
    
    dep와 Modules는 이 파일import에 있기 때문에 도구의 버전도 정확하게 관리할 수 있습니다.

    총결산


    개발용 도구(CLI)의 관리gex를 소개했습니다. 기억하는 것은 gex --add 정도입니다. 관리 자체는 dep와 Modules에 버려져 있기 때문에 어떤 환경에서도 쉽게 가져올 수 있습니다.
    이것들은 모두 모듈에 흡수될 것 같지만, 반드시 이전의 연결에 사용하십시오.
    한편 원티드 테크북5에서는 실제로 gex를 어떻게 사용하는지 등을 소개했다.기술서전 5 ~ 20 발표 예정이니 잘 부탁드린다

    좋은 웹페이지 즐겨찾기