gopath없이 로컬 패키지를 가져 오는 방법
나는 사용 GOPATH
했지만이 현재 문제에 직면하고 있는데 도움이되지 않습니다. 프로젝트와 관련된 패키지를 만들 수 있기를 원합니다.
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
나는 여러 가지 방법을 시도했지만 어떻게받을 수 있나요 package1.go
[작업에 binary1.go
나 binary2.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
이 때문에, 주로 수동 프로세스입니다 dep
및 vgo
작성되었습니다.
편집 1 : 내 옛날 방식은 더 이상 "올바른"방법이 아닙니다. 당신은 사용해야 공급 업체의 능력을, vgo
또는 dep
이동 1.6에서 기본적으로 사용되는 (지금은) 참조하십시오 . 기본적으로 vendor
디렉토리 내에 "외부"또는 "종속"패키지를 추가합니다 . 컴파일시 컴파일러는이 패키지를 먼저 사용합니다.
녹이다. GOPATH
하위 폴더를 package1
만든 다음 과 같은 import "./package1"
in binary1.go
및 binary2.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
'Programing' 카테고리의 다른 글
로컬 시스템 계정으로 CMD.exe를 어떻게 실행합니까? (0) | 2020.06.23 |
---|---|
C #에서 배열의 일부를 다른 배열로 복사하는 방법은 무엇입니까? (0) | 2020.06.23 |
C #의 특정 시간대에서 DateTime 만들기 (0) | 2020.06.23 |
트랩과 인터럽트의 차이점은 무엇입니까? (0) | 2020.06.23 |
Chrome Uncaught Syntax Error : 예기치 않은 토큰 불법 (0) | 2020.06.23 |