GOPATH 외부의 Go 프로젝트에 대한 소스 코드가 나쁜 생각입니다.


32

Go를 사용하여 새 프로젝트를 진행 중이며 모두 Go에 익숙하지 않습니다. 우리는 표준 go 디렉토리 구조를 따르고 있으며 모든 코드를

$ GOPATH / src / github.com / companyname / projectname

이것은 또한 git 저장소의 루트입니다

표준 권장 경로 레이아웃은, 특히 Go 기반 rest / http 백엔드 및 html / javascript 프론트 엔드와 같은 다국어 프로젝트에서 작업하는 경우 약간 이상하게 보입니다. 이 경우 프로젝트 구조가 다음과 같이 표시되기를 원할 것입니다.

/
  doc/
  src/
    server/
      main.go
      module1/
        module.go
    client/
      index.html
  Makefile

그러나 실제로 GOPATH 안에 코드를 배치해야합니까?

시도로 소스 코드가 GOPATH 외부에있는 작은 프로그램을 만들었습니다. 프로젝트를 패키지로 쉽게 나눌 수 있으므로 패키지를 사용하여 폴더 mainfoo패키지를 참조 할 수 있습니다.foo/import "./foo"

내가 볼 수있는 한, 이것이 허용하지 않는 두 가지가 있습니다.

  • 다른 코드는이 코드를 가져올 수 없습니다. 우리가 회사를 위해 특별히 서비스를 구축 할 때 이것은 문제가되지 않습니다.
  • go install설치할 수 없습니다 . 이것도 문제가되지 않습니다. 빌드 파이프 라인은 도구를 설치합니다.

그러나 빌드 서버가 작업 공간을 GOPATH 내에 두지 않도록합니다.

그러한 접근은 권장되지 않습니까? 그렇다면 왜 그렇습니까?

내가 열거 한 두 가지 부작용 외에 다른 부작용이 있습니까?

이것은 공개 공개 소스 코드가 아닌 회사의 개인 프로젝트라는 점을 명심하십시오.

GOPATH에서 실제 프로젝트를 분리하는 것은 유혹적인 것처럼 보이지만 Shu 단계 에있을 때는 규칙을 위반할 때주의해야합니다.

답변:


12

GOPATH를 사용할 필요는 없지만 go명령 에서 얻을 수있는 모든 멋진 도구를 놓치게됩니다 . 모두 코드가 표준 GOPATH 계층 구조에 있어야합니다.

당신은 언급 go install했지만 go test(그리고 훌륭한 go test -cover적용 범위 도구)는 작동하지 않습니다. go get원격 코드를 다운로드하면 GOPATH에 모든 것을 쓸 수 있으므로 모든 것을 복사해야합니다.

물론, 모든 것을 make / scons / cmake / 무엇이든 대체하고 무엇이든 할 수 있으며 환경에 도움이 될 수 있지만 go도구 로 수행 할 수있는 추가 작업이 가능합니다 .


9

(면책 조항 : 나는 이런 것들을 디자인하는 것을 좋아하지만 Go to new, 실제로 시도하지는 않았습니다)

아이디어 : 왜 둘 다?

심볼릭 링크를 고려하면 두 가지 극성 옵션을 사용할 수 있습니다.

(A) src의 코드, 작업 공간과 심볼릭 연결

/
  doc/
  src/
    server/
      projectname/
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname -> ../../../src/server/projectname
      github.com/
        someone/
          library/
    bin/
    pkg/
  Makefile

(B) src에 링크 된 작업 공간의 코드

/
  doc/
  src/
    server/
      projectname -> ../../go_workspace/src/companyname/projectname
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname/
      github.com/
        someone/
          somelib/
    bin/
    pkg/
  Makefile

다음과 같은 이유로 "A"에 기대 었습니다.

  • 모든 출처는 물리적으로 가깝게 산다
  • projectname 쉽게 자체 리포지토리를 가질 수 있거나 전체 프로젝트에 대해 하나의 리포지토리를 가질 수 있습니다.
  • 전체 go_workspace버전을 유지 하고 make 단계를 통해 초기화 할 수 있습니다 ( godep프로젝트 사용 및 심볼릭 연결)

1
"B"를 사용하면 "go install : GOPATH 외부의 {dir} 디렉토리에 대한 설치 위치가 없습니다"라는 메시지가 표시되므로 "A"여야합니다.
OJFord

2

2019 년 업데이트

GOPATH더 이상 프로젝트를 저장할 필요가 없습니다.

외부 디렉토리에 넣으십시오 GOPATH. 그런 다음 다음을 입력하십시오.

go mod init github.com/youruser/yourproject

당신은 갈 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.