Programing

gopath없이 로컬 패키지를 가져 오는 방법

crosscheck 2020. 6. 23. 07:44
반응형

gopath없이 로컬 패키지를 가져 오는 방법


나는 사용 GOPATH했지만이 현재 문제에 직면하고 있는데 도움이되지 않습니다. 프로젝트와 관련된 패키지를 만들 수 있기를 원합니다.

myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go

나는 여러 가지 방법을 시도했지만 어떻게받을 수 있나요 package1.go[작업에 binary1.gobinary2.go에 그래서?

예를 들어; 나는 할 수 있도록하려면 import "package1"다음 실행할 수 go build binary1.go및 모든 오류가 패키지에서 찾을 수 없음을 발생하지 않고 잘 작동 GOROOT하거나 GOPATH. 이런 종류의 기능이 필요한 이유는 대규모 프로젝트를위한 것입니다. 다른 여러 패키지를 참조하거나 하나의 큰 파일로 유지하고 싶지 않습니다.


이동 종속성 관리 요약 :

  • vgo 이동 버전이 다음과 같은 경우 : x >= go 1.11
  • dep또는 vendor이동 버전이 다음 과 같은 경우 :go 1.6 >= x < go 1.11
  • go 버전이 다음과 같은 경우 수동으로 : x < go 1.6

편집 3 : Go 1.11에는 대체 할 기능 vgo있습니다. dep

를 사용하려면 모듈 설명서를 vgo참조하십시오 . 아래의 TLDR :

export GO111MODULE=on
go mod init
go mod vendor # if you have vendor/ folder, will automatically integrate
go build

이 메소드는 go.mod프로젝트 디렉토리에서 호출 파일을 작성합니다 . 그런 다음로 프로젝트를 빌드 할 수 있습니다 go build. GO111MODULE=auto이 설정되어 있으면 프로젝트가에있을 수 없습니다 $GOPATH.


편집 2 : 공급 업체 방법은 여전히 ​​유효하며 문제없이 작동합니다. vendor이 때문에, 주로 수동 프로세스입니다 depvgo작성되었습니다.


편집 1 : 내 옛날 방식은 더 이상 "올바른"방법이 아닙니다. 당신은 사용해야 공급 업체의 능력을, vgo또는 dep이동 1.6에서 기본적으로 사용되는 (지금은) 참조하십시오 . 기본적으로 vendor디렉토리 내에 "외부"또는 "종속"패키지를 추가합니다 . 컴파일시 컴파일러는이 패키지를 먼저 사용합니다.


녹이다. GOPATH하위 폴더를 package1만든 다음 같은 import "./package1"in binary1.gobinary2.go스크립트를 사용 하여 로컬 패키지를 가져올 수있었습니다 .

binary1.go

...
import (
        "./package1"
      )
...

따라서 현재 디렉토리 구조는 다음과 같습니다.

myproject/
├── binary1.go
├── binary2.go
├── package1/
│   └── package1.go
└── package2.go

또한 상대 경로 (적어도 1.5 이상)도 작동합니다. 예를 들면 다음과 같습니다.

import "../packageX"

"로컬 패키지"와 같은 것은 없습니다. 디스크의 패키지 구성은 패키지의 상위 / 하위 관계와 직교합니다. 패키지에 의해 형성된 유일한 실제 계층은 종속성 트리이며, 일반적으로 디렉토리 트리를 반영하지 않습니다.

그냥 사용

import "myproject/packageN"

정당한 이유없이 빌드 시스템과 싸우지 마십시오. 예를 들어, 상대적 가져 오기 경로가있는 프로젝트는 얻을 수 없기 때문에 사소하지 않은 프로그램에서 가져 오기 당 12 개의 문자를 저장하는 것은 좋은 이유가 아닙니다.

가져 오기 경로의 개념에는 몇 가지 중요한 특성이 있습니다.

  • 가져 오기 경로는 전 세계적으로 고유 할 수 있습니다.
  • GOPATH와 함께 가져 오기 경로를 명확하게 디렉토리 경로로 변환 할 수 있습니다.
  • GOPATH 아래의 모든 디렉토리 경로는 명확하게 가져 오기 경로로 변환 될 수 있습니다.

위의 모든 것은 상대 가져 오기 경로를 사용하여 망칩니다. 하지마.

추신 : Go 컴파일러 테스트의 레거시 코드에는 상대적 가져 오기를 사용하는 곳이 거의 없습니다. ATM, 이것이 상대 수입이 전혀 지원되는 유일한 이유입니다.


아마도 패키지를 모듈화하려고합니다. 나는 그 있으리라 믿고있어 package1하고 package2있으며, 방법으로, 동일한 패키지의 일부를하지만 가독성 당신이있는 거 분할 여러 파일로 사람들을 위해.

이전 사례가 본인의 사례 인 경우 여러 패키지에 동일한 패키지 이름을 사용할 수 있으며 동일한 파일이있는 것처럼 보입니다.

이것은 예입니다 :

add.go

package math

func add(n1, n2 int) int {
   return n1 + n2
}

빼기

package math

func subtract(n1, n2 int) int {
    return n1 - n2
}

donothing.go

package math

func donothing(n1, n2 int) int {
    s := add(n1, n2)
    s = subtract(n1, n2)
    return s
}

나는 Go 전문가가 아니며 이것이 StackOveflow의 첫 번째 게시물이므로 조언이 있으면 잘 받아 들일 것입니다.


비슷한 문제가 있으며 현재 사용중인 솔루션은 Go 1.11 모듈을 사용합니다. 나는 다음과 같은 구조를 가지고 있습니다

- projects
  - go.mod
  - go.sum
  - project1
    - main.go
  - project2
    - main.go
  - package1
    - lib.go
  - package2
    - lib.go

And I am able to import package1 and package2 from project1 and project2 by using

import (
    "projects/package1"
    "projects/package2"
)

After running go mod init projects. I can use go build from project1 and project2 directories or I can do go build -o project1/exe project1/*.go from the projects directory.

The downside of this method is that all your projects end up sharing the same dependency list in go.mod. I am still looking for a solution to this problem, but it looks like it might be fundamental.


To add a "local" package to your project, add a folder (for example "package_name"). And put your implementation files in that folder.

src/github.com/GithubUser/myproject/
 ├── main.go
 └───package_name
       └── whatever_name1.go
       └── whatever_name2.go

In your package main do this:

import "github.com/GithubUser/myproject/package_name"

Where package_name is the folder name and it must match the package name used in files whatever_name1.go and whatever_name2.go. In other words all files with a sub-directory should be of the same package.

You can further nest more subdirectories as long as you specify the whole path to the parent folder in the import.

참고URL : https://stackoverflow.com/questions/17539407/how-to-import-local-packages-without-gopath

반응형