수락 된 대답은 여전히 패키지 이름과 디렉토리를 일치시켜야한다는 데에는 맞지만 GOPATH를 사용하는 대신 Go 모듈을 사용하여 마이그레이션해야합니다. 이 문제가 발생하는 새로운 사용자는 이제 구식 인 GOPATH 사용에 대해 혼란 스러울 수 있습니다. 따라서이 문제를 해결하고 Go 모듈을 사용할 때이 문제를 방지하는 데 도움이되는 지침을 제공하려고합니다.
Go 모듈에 이미 익숙하고이 문제가 발생하는 경우 간과하거나 잊기 쉬운 Go 규칙 중 일부를 다루는 아래의 특정 섹션으로 건너 뛰십시오.
이 가이드는 Go 모듈에 대해 설명합니다 : https://golang.org/doc/code.html
Go 모듈을 사용한 프로젝트 구성
해당 기사에서 언급 한대로 Go 모듈로 마이그레이션 한 후에는 다음과 같이 프로젝트 코드를 구성하십시오.
저장소에는 하나 이상의 모듈이 있습니다. 모듈은 함께 릴리스되는 관련 Go 패키지의 모음입니다. Go 저장소에는 일반적으로 저장소의 루트에 하나의 모듈 만 있습니다. go.mod라는 파일은 모듈 경로를 선언합니다 : 모듈 내의 모든 패키지에 대한 가져 오기 경로 접두사. 이 모듈에는 해당 go.mod 파일이 포함 된 디렉토리 및 해당 go-mod 파일이 포함 된 다음 서브 디렉토리 (있는 경우)의 패키지가 포함됩니다.
각 모듈의 경로는 패키지의 가져 오기 경로 접두사 역할을 할뿐만 아니라 go 명령이 다운로드 할 위치를 나타냅니다. 예를 들어, golang.org/x/tools 모듈을 다운로드하기 위해 go 명령은 https://golang.org/x/tools (여기에 설명 되어 있음)로 표시된 저장소를 참조합니다 .
가져 오기 경로는 패키지를 가져 오는 데 사용되는 문자열입니다. 패키지의 가져 오기 경로는 모듈 내의 하위 디렉토리와 결합 된 모듈 경로입니다. 예를 들어, github.com/google/go-cmp 모듈은 cmp / 디렉토리에 패키지를 포함합니다. 해당 패키지의 가져 오기 경로는 github.com/google/go-cmp/cmp입니다. 표준 라이브러리의 패키지에는 모듈 경로 접두사가 없습니다.
다음과 같이 모듈을 초기화 할 수 있습니다.
$ go mod init github.com/mitchell/foo-app
코드를 빌드하기 위해 github.com에 코드를 배치하지 않아도됩니다. 그러나 모듈이 마치 게시 될 것처럼 구성하는 것이 가장 좋습니다.
패키지를 가져올 때 발생하는 상황 이해
좋은 기사는 여기있다 당신이 패키지 또는 모듈받을 때 어떻게되는지에 대해 이야기 : https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16
그것은 설명 패키지가 저장 것이다 Go 모듈을 이미 사용중인 경우이 오류가 발생하는 이유를 이해하는 데 도움이됩니다.
가져온 기능이 내보내 졌는지 확인
다른 파일에서 함수에 액세스하는 데 문제가있는 경우 함수를 내보냈는지 확인해야합니다. 내가 제공 한 첫 번째 링크에서 설명한대로 함수는 대문자로 시작하여 내 보내야하며 다른 패키지로 가져올 수 있어야합니다.
디렉토리 이름
허용되는 답변에서 언급 한 다른 중요한 세부 사항은 디렉토리 이름이 패키지 이름을 정의하는 것입니다. (귀하의 패키지 이름은 디렉토리 이름과 일치해야합니다.) 당신은 여기의 예를 볼 수 있습니다 https://medium.com/rungo/everything-you-need-to-know-about-packages-in-go-b8bac62b74cc
으로 main
즉, 메소드가 포함 된 파일 (즉, 애플리케이션의 진입 점)은이 요구 사항에서 제외됩니다.
예를 들어, 다음과 같은 구조를 사용할 때 가져 오기에 문제가있었습니다.
/my-app
├── go.mod
├── /src
├── main.go
└── /utils
└── utils.go
코드를 패키지 utils
로 가져올 수 없습니다 main
.
그러나 main.go
아래에 표시된 것처럼 자체 하위 디렉토리에 넣으면 가져 오기가 정상적으로 작동합니다.
/my-app
├── go.mod
├── /src
├── /app
| └── main.go
└── /utils
└── utils.go
이 예에서 내 go.mod 파일은 다음과 같습니다.
module git.mydomain.com/path/to/repo/my-app
go 1.14
에 참조를 추가 한 후 main.go를 저장하면 utils.MyFunction()
IDE가 다음과 같이 패키지에 대한 참조를 자동으로 가져옵니다.
import "git.mydomain.com/path/to/repo/my-app/src/my-app"
(저는 Golang 확장자로 VS Code를 사용하고 있습니다.)
가져 오기 경로에는 패키지의 서브 디렉토리가 포함되어 있습니다.
개인 리포지토리 다루기
코드가 개인 저장소의 일부인 경우 액세스를 활성화하려면 git 명령을 실행해야합니다. 그렇지 않으면, 당신은이 문서가 개인 Github에서,의 Bitbucket 및 GitLab의 REPOS 동안 그 작업을 수행하는 방법을 언급 다른 오류가 발생할 수 있습니다 https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4
이 문제는 여기에서도 논의됩니다. 개인 저장소를 "가져 오는"올바른 방법은 무엇입니까?