Golang 사용 총결산: GOPATH와 GOROOT의 차이점, GOPATH는 여러 개를 설정해야 하나요?

4071 단어 golanggopath
이 기사에서 해결해야 할 문제:
  • GOPATH와 GOROOT의 차이점은?
  • GOPATH를 여러 개로 구성해야 합니까?

  • 문제1: GOPATH와 GOROOT의 차이점은?
    다음과 같이 쉽게 이해할 수 있습니다.
    $GOPATH는 go의 프로젝트 디렉터리입니다
    TENCENT64: 14:31 ~/golearn/go_proj > echo $GOPATH
    /data/home/user/golearn/go_proj/
    TENCENT64: 14:31 ~/golearn/go_proj > cd /data/home/user/golearn/go_proj/
    TENCENT64: 14:31 ~/golearn/go_proj > tree -L 1
    .
    |-- bin
    |-- pkg
    `-- src
    

    $GOROOT은 go의 설치 디렉토리입니다.
    TENCENT64: 14:34 ~/golearn/go_proj > echo $GOROOT
    /usr/local/go
    TENCENT64: 14:34 ~/golearn/go_proj > cd /usr/local/go
    TENCENT64: 14:35 /usr/local/go > tree -L 1
    .
    |-- api
    |-- AUTHORS
    |-- bin
    |-- blog
    |-- CONTRIBUTING.md
    |-- CONTRIBUTORS
    |-- doc
    |-- favicon.ico
    |-- lib
    |-- LICENSE
    |-- misc
    |-- PATENTS
    |-- pkg
    |-- README.md
    |-- robots.txt
    |-- src
    |-- test
    `-- VERSION
    

    go env를 실행하여 go의 모든 구성 정보를 볼 수 있습니다.
    jameszhou@TENCENT64: 14:42 ~/golearn/go_proj/src > go env
    GOARCH="amd64"
    GOBIN=""
    GOEXE=""
    GOHOSTARCH="amd64"
    GOHOSTOS="linux"
    GOOS="linux"
    GOPATH="/data/home/user/golearn/go_proj/"
    GORACE=""
    GOROOT="/usr/local/go"
    GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
    GCCGO="gccgo"
    CC="gcc"
    GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build189212099=/tmp/go-build"
    CXX="g++"
    CGO_ENABLED="1"
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    
    

    세부 메모:
  • GOPATH 사용:
  • 여러 개의 디렉터리를 허용합니다. 여러 개의 디렉터리가 있을 때 구분자를 주의하십시오. 여러 디렉터리가 있을 때 Mac와 Linux에서':'분할;Windows는 세미콜론입니다.
  • GOPATH가 여러 개 있을 때 기본적으로 goget에서 가져온 패키지를 첫 번째 디렉터리에 저장합니다
  • $GOPATH 디렉터리에 세 개의 하위 디렉터리가 있음
  • src: 소스 코드 저장(예:.go.c.h.s 등)golang의 기본 약속에 따라 gorun, go install 등 명령의 현재 작업 경로(예를 들어 이 경로에서 상기 명령을 실행)
  • pkg: 컴파일할 때 생성된 중간 파일(예를 들어.a)golang 컴파일러일 때.
  • bin: 컴파일한 실행 파일 (프로젝트에서 go install을 실행하면 실행 파일을 bin 디렉터리에 설치합니다) (편의를 위해 이 디렉터리를 P A T H 변수에 추가할 수 있습니다. g o p a t h가 여러 개 있으면 PATH 변수 중, gopath가 여러 개 있으면 PATH 변수 중, gopath가 여러 개 있으면 {GOPATH/?/bin:}/bin을 사용하여 모든 bin 디렉터리를 추가할 수 있습니다.


  • $GOROOT 사용:
  • 먼저 linux에서 go 패키지를 다운로드합니다.https://studygolang.com/dl/golang/go1.9.2.linux-amd64.tar.gz
  • 다운로드 후 tar-zxvf go1.9.2.linux-amd64.tar.gz 압축 해제 원본 패키지
  • /usr/local/go, 즉 GOROOT
  • 로 이동
  • bashrc에서 GOPATH 및 GOROOT 구성:
  • export GOPATH=/data/home/user/golearn/go_proj/
    export GOROOT=/usr/local/go
    
    

    질문2: GOPATH를 여러 개 구성해야 합니까?
    현재 조사 연구를 통해 인터넷은 크게 세 가지 유파로 나뉘는데 각 유파의 사용 방식은 각기 장점과 단점이 있다.
  • 첫 번째: 전역적으로 gopath가 있고 제3자 라이브러리와 프로젝트 원본은 모두 같은 gopah에 놓여 있다.github 관리 원본(회사 내부는git.code 플랫폼)+glide(go 패키지 관리 도구)로 관리 의존 패키지를 사용합니다.
  • 장점: 경로가 하나밖에 없어서 충분하고 간단하며 모든 프로젝트 코드가 일목요연하고 읽기가 편리하다.glide로 버전 의존 관리를 실현하여 제3자 의존 패키지 업그레이드 충돌 문제를 해결했다.
  • 단점: 프로젝트 간의 의존이 격리되지 않아 원하지 않는 의존으로 잘못 인용되기 쉽다.업무 코드는 제3자 의존 패키지 코드와 같은 디렉터리에 있어 보기 좋지 않다.

  • 두 번째: 두 개의 gopath만 있고 첫 번째 gopath는 제3자 의존 패키지, 두 번째 gopath 저장 업무 항목이다.프로젝트 의존 관리 역시glide로 해결할 수 있습니다.
  • 세 번째: 각 항목마다 자신만의 gopath가 있다.장점은 프로젝트가 임의의 디렉터리에서 성공적으로 컴파일되고 프로젝트 간에 어떠한 의존도 없다는 것이다.단점은 현재 마이크로 서비스의 흐름이다. 하나의 대형 프로젝트 아래에서 n자 프로젝트로 나누어지면 gopath 내에서 몇 십 개의 프로젝트 경로를 가볍게 넘을 수 있다.해결 방법은 항목마다build을 만드는 것입니다.sh 스크립트,build을 실행합니다.sh 스크립트, 현재 프로젝트 디렉터리를 gopath로 동적으로 설정한 다음 gobuild을 실행합니다. 프로젝트 copy가 임의의 디렉터리로 컴파일될 수 있도록 합니다.

  • 현재 그룹 내에서 사용되는 설정은 첫 번째와 두 번째 설정입니다.
    참조 자료:
  • Go 프로그래밍을 사용하는 방법:https://go-zh.org/doc/code.html
  • Whats a good best practice with Go workspaces?:https://stackoverflow.com/questions/20722502/whats-a-good-best-practice-with-go-workspaces
  • 여러분은 현재 고 프로젝트를 어떻게 관리하고 있습니까?하나의 항목은 gopath 아래의 가방입니까, 아니면 새로운 gopath입니까?https://www.zhihu.com/question/47538279
  • Go 가방 관리의 전생:https://www.ctolib.com/topics-123305.html
  • 좋은 웹페이지 즐겨찾기