go 모듈 내에서 로컬 패키지에 액세스 (go 1.11)


81

Go의 새로운 모듈 시스템을 시험하고 있는데 로컬 패키지에 액세스하는 데 문제가 있습니다. 다음 프로젝트는 내 gopath 외부의 내 데스크톱 폴더에 있습니다.

내 프로젝트 구조는 다음과 같습니다.

/
  - /platform
      - platform.go
  - main.go
  - go.mod

// platform.go
package platform

import "fmt"

func Print() {
    fmt.Println("Hi")
}

// main.go
package main

import "platform"

func main() {
    platform.Print()
}

go build main.go 나에게 말한다

cannot find module for path platform

2
안녕하세요 David, 제 답변이 귀하의 질문에 대한 답변이라고 생각되면 답변으로 표시해주십시오. 감사!
Halil Kaskavalci

2.3.3 이후의 maven golang 플러그인은 로컬 모듈과 함께 작업 할 수 있습니다 (빌드 중에 자동으로 로컬 경로를 추가 함), 몇 가지 예를 살펴볼 수 있습니다. github.com/raydac/mvn-golang/tree/master/mvn-golang- 예 / ...
이고르 Maznitsa

답변:


52

이러한 문제를 즉시 처리하는 go 도구 모음을 사용하는 것이 좋습니다. vscode-go 플러그인이있는 Visual Studio Code는 정말 유용합니다.

여기서 문제는 Go에 대해 $GOPATH/src또는 moduleimport 문과 관련하여 상대 경로가 필요하다는 것 입니다. 에서 어디에 있는지에 따라 GOPATH가져 오기 경로에도 포함되어야합니다. 이 경우 import 문은 go 모듈 경로를 포함해야합니다.go.mod

고 패스

프로젝트가 여기에 있다고 가정합니다.

$GOPATH/src/github.com/myuser/myproject

가져 오기 경로는 다음과 같아야합니다.

import "github.com/myuser/myproject/platform"

VGO

go.mod 파일이 다음과 같다고 가정합니다.

module example.com/myuser/myproject

가져 오기 경로는 다음과 같아야합니다.

import "example.com/myuser/myproject/platform"

이것은 강타였습니다. go 모듈의 경우에는 vgo의 패턴을 따라야합니다. 여기서 모듈의 이름으로 import 문의 경로를 시작합니다. 감사!
David Alsh

15
잠깐, 혼란 스러워요. 내 모듈이 내 파일 시스템의 어딘가에 있다면 모듈 시스템이 어떻게 찾습니까?
Narfanator

1
모듈 내부에있는 go.mod경우 가져 오기 경로가 모듈 이름 (예 : import "github.com/my/module/pkg"`)으로 시작하는 전체 가져 오기 경로 인 경우 패키지 가져 오기 경로 및 디스크 의 파일 위치를 사용하여 동일한 모듈에서 패키지를 찾습니다. . 디스크의 다른 곳에있는 다른 모듈에서 패키지를 찾으려면 여기에 replace 지시문이 있습니다.이 답변 은 모듈 구조 및 가져 오기 경로에 대해 자세히 다룹니다.
typical182

6
왜 모두가 URL 형식을 계속 사용합니까? 질문은 매우 분명했습니다. localmodule / localmodule.go 그게 다입니다. 왜 여기에 githubs와 example.com이 있습니까?
holms

@holms에 대한 답변과 위의 주석에 설명되어 있지만 명확히하기 위해 언어에는 내부 패키지를 찾을 수있는 메커니즘이 없으며 go 도구 만 있습니다. go 도구는 GOPATH 또는 모듈 구성 (go.mod)에 따라 다릅니다. 본질적으로 go 도구 기능을 사용하여 로컬 패키지를 다른 종류의 패키지 와 동일하게 처리합니다 . 이 질문에 대한 다른 답변도 참조하십시오.
user4893106

116

내가 먼저이를 정의 할 수 modules의 모음입니다 packages. Go 11에서는 다음과 같은 go 모듈을 사용 합니다.

두 패키지가 동일한 프로젝트에있는 경우 다음을 수행 할 수 있습니다. In go.mod:

module github.com/userName/moduleName

그리고 당신의 내부 main.go

import "github.com/userName/moduleName/platform"

그러나 그들이 별도의 모듈, 즉 다른 물리적 경로이고 packages예를 들어 원격으로 github에 게시하지 않고 로컬을 가져 오려면 replace지시문 을 사용하여이 작업을 수행 할 수 있습니다.

모듈 이름과은 (는) 이름이 지정 github.com/otherModule되어 platform있는 유일한 패키지입니다. 메인 모듈 go.mod에 다음 줄을 추가하십시오.

module github.com/userName/mainModule

require "github.com/userName/otherModule" v0.0.0
replace "github.com/userName/otherModule" v0.0.0 => "local physical path to the otherModule"

참고 : 경로는 모듈의 루트 디렉토리를 가리켜 야하며 절대적이거나 상대적 일 수 있습니다.

내부 에서 다음 main.go과 같은 특정 패키지를 가져옵니다 .platformotherModule

import "github.com/userName/otherModule/platform"

여기의 부드러운 도입 Golang 모듈은


3
OMG이 대답은 나를 많이 도왔습니다. 감사합니다 :)
Adis Azhar

2
replace 지시문 만 포함 된 go.mod를 사용했는데 프로젝트를 빌드하는 데 require 지시문이 필요하지 않았습니다.
mh-cbon

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