Go 빌드 :“패키지를 찾을 수 없습니다”(GOPATH가 설정되어 있어도)


139

GOPATH제대로 설정 했지만 내 패키지를 찾기 위해 여전히 "go build"또는 "go run"을 얻을 수 없습니다. 내가 뭘 잘못하고 있죠?

$ echo $GOROOT
/usr/local/go

$ echo $GOPATH
/home/mitchell/go

$ cat ~/main.go
package main
import "foobar"
func main() { }

$ cat /home/mitchell/go/src/foobar.go
package foobar

$ go build main.go
main.go:3:8: import "foobar": cannot find package

github.com/adonovan/gopl.io/tree/master/ch1/helloworld를 가져올 때도 같은 문제가 발생합니다 . 이유는 helloworld.go라는 파일이 없기 때문입니다. 패키지 이름과 파일 이름을 일치시켜 작업하십시오.
keniee van

Go를 업그레이드해야 할 수도 있습니다. go.mod를 사용하여 모듈을 정의하는 기존 코드가있는 비슷한 문제가있었습니다. 테스트 시스템에서 코드를 다운로드하여 컴파일하려고했지만 GoPATH와 관련된 모든 종류의 오류가 발생하고 모듈을 찾을 수 없습니다. Go 버전 1.7이었습니다. Go를 업그레이드하자마자 문제없이 작동했습니다.
KyferEz

최신 설명을위한 터미널입니다$ go help gopath
A1rPun

답변:


162

foobar.go소스 파일이라는 디렉토리에 없기 때문에 작동하지 않습니다 foobar. go buildgo install디렉토리가 아닌 소스 파일과 일치하려고합니다.

  1. $GOPATH유효한 디렉토리로 설정하십시오 . 예 :export GOPATH="$HOME/go"
  2. 이동 foobar.go$GOPATH/src/foobar/foobar.go및 건물은 잘 작동합니다.

추가 권장 단계 :

  1. $GOPATH/bin귀하의 추가 $PATH:PATH="$GOPATH/bin:$PATH"
  2. 예를 들어 main.go의 하위 폴더로 이동$GOPATH/src$GOPATH/src/test
  3. go install test이제 터미널 $GOPATH/bin에 입력하여 호출 할 수 있는 실행 파일을 만들어야합니다 test.

1
이것은 버그가 아닌가? My GOPATH=/usr/local/go-pkgs이므로 Go는 /usr/local/go-pkgs/src/<package-name>소스를 찾아 보지만에 go get넣습니다 /usr/local/go-pkgs/src/gopkg.in/<package-name>. 설치 후 모든 패키지를 수동으로 이동해야하는 이유는 무엇입니까? 그냥 바보입니다.
요시야

3
go get일반적으로 패키지를 넣으 $GOPATH/src/므로 호출 go get domain.com/path/to/package하면로 끝납니다 $GOPATH/src/domain.com/path/to/package. 패키지를 가져 오려고 생각 gopkg.in하십니까? 그렇다면 절대 의도 된 동작이므로 이름으로 가져와야합니다. 예를 들면 import "gopkg.in/yaml.v1"로서도 해당 문서에서 설명 .
fasmat

1
아, 알 겠어요 내 무지를 없애 줘서 고마워
요시야

10

편집 : GOPATH를 의미했기 때문에 fasmat답변을 참조하십시오 (위)

" 패키지를 어떻게 찾습니까? " 에서 언급했듯이 패키지 xxx를 디렉토리에 넣어야합니다 xxx.

Go 언어 사양을 참조하십시오 .

package math

PackageName패키지의 구현과 동일한 형식을 공유하는 파일 세트 .
구현시 패키지의 모든 소스 파일이 동일한 디렉토리에 있어야합니다.

코드 조직은 언급 :

패키지 " widget" 를 가져 오는 프로그램을 빌드 할 때 go명령이 src/pkg/widgetGo 루트 내부를 찾은 다음 패키지 소스를 찾을 수없는 경우 src/widget각 작업 공간 내부를 순서대로 검색합니다 .

( "작업 공간"은 다음의 경로 항목입니다 GOPATH. 해당 변수는 ' src, bin, pkg'에 대한 여러 경로를 참조 할 수 있습니다.)


(원래 답변)

" Go 코드 작성 방법 "에 설명 된대로 GOPATH~ / go가 아니라 ~ / go로 설정해야합니다 .GOROOT

Go 경로는 가져 오기 문을 해결하는 데 사용됩니다. go / build 패키지에 의해 구현되고 문서화됩니다.

GOPATH환경 변수를 나열 장소로 이동 코드를 볼 수 있습니다.
Unix에서 값은 콜론으로 구분 된 문자열입니다.
Windows에서 값은 세미콜론으로 구분 된 문자열입니다.
계획 9에서 값은 목록입니다.

그것은 다음과 다릅니다 GOROOT.

Go 바이너리 배포판은 배포 가 Windows /usr/local/go(또는 c:\GoWindows)에 설치 될 것이라고 가정 하지만 다른 위치에 설치할 수 있습니다.
이렇게하면 GOROOTGo 도구를 사용할 때 환경 변수를 해당 디렉토리 로 설정해야 합니다.


4
도있다 짧은 비디오 소개 GOPATH 설정하는
울프 홀름 닐슨

1
죄송합니다. 원래 질문을 편집했습니다. 어디에서나 GOROOT를 말하면 GOPATH를 의미 했습니다.
MitchellSalad

3

TL; DR : Go 규칙을 따르십시오! (손님이 어려운 방법을 배웠습니다), 이전 버전을 확인하고 제거하십시오 . 최신을 설치하십시오.

나에게 해결책은 달랐다. 공유 Linux 서버에서 작업했으며 내 GOPATH환경 변수와 다른 환경 변수를 여러 번 확인한 후에도 여전히 작동하지 않습니다. '패키지를 찾을 수 없음'및 '인식 할 수없는 가져 오기 경로'를 포함하여 몇 가지 오류가 발생했습니다. 로 다시 설치하려고 후 의 지시에 의해 솔루션 golang.org 합니다 (포함 제거 여전히 발생하는 문제 부분).

제거되지 않은 이전 버전 (실행 여전히이 있다고 실현하기 위해 좀 시간이 걸렸 go version다음 which go다시 ... DAHH)에 저를 얻었다 질문 마침내 해결은.


2

수락 된 대답은 여전히 ​​패키지 이름과 디렉토리를 일치시켜야한다는 데에는 맞지만 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 이 문제는 여기에서도 논의됩니다. 개인 저장소를 "가져 오는"올바른 방법은 무엇입니까?


-6

당신의 절대 디렉토리 추가 봤어 이동을 하여 '경로'에?

export PATH=$PATH:/directory/to/go/

$ PATH는 go 패키지 경로와 아무 관련이 없습니다.
csgeek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.