[go] Go에서 로컬 패키지를 가져 오는 방법은 무엇입니까?

저는 처음으로 현지화하려는 예제 코드를 작성하고 있습니다.

원래 main.go수입 명세서 에서는 다음과 같습니다.

 import (
    "log"
    "net/http"
    "github.com/foo/bar/myapp/common"
    "github.com/foo/bar/myapp/routers"
)

이제 내가 가지고 common있고 routers포장/home/me/go/src/myapp

그래서 import 문을 다음과 같이 변환했습니다.

import (
    "log"
    "net/http"
    "./common"
    "./routers"
)

하지만 실행할 때 go install myapp다음 오류가 발생합니다.

can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package

또한, 나는 사용할 때 commonrouters대신 ./common./routersimport 문에, 내가 얻을 :

myapp/main.go:7:3: cannot find package "common" in any of:
    /usr/local/go/src/common (from $GOROOT)
    /home/me/go/src/common (from $GOPATH)
myapp/main.go:8:2: cannot find package "routers" in any of:
    /usr/local/go/src/routers (from $GOROOT)
    /home/me/go/src/routers (from $GOPATH)

이 문제를 어떻게 해결할 수 있습니까?



답변

글쎄, 나는 문제를 알아 냈다. 기본적으로 가져 오기 시작 경로는$HOME/go/src

따라서 myapp패키지 이름 앞에 추가 해야합니다. 즉, 가져 오기는 다음과 같아야합니다.

import (
    "log"
    "net/http"
    "myapp/common"
    "myapp/routers"
)


답변

위의 Go 1.5를 사용하는 경우 공급 업체 기능을 사용해 볼 수 있습니다 . 로컬 패키지를 공급 업체 폴더 에 넣고 더 짧은 경로로 가져올 수 있습니다. 귀하의 경우에는 공급 업체 폴더 안에 commonrouters 폴더를 넣을 수 있습니다.

myapp/
--vendor/
----common/
----routers/
------middleware/
--main.go

다음과 같이 가져옵니다.

import (
    "common"
    "routers"
    "routers/middleware"
)

Go는 $ GOPATH / src 대신 프로젝트의 공급 업체 디렉토리 (최소 하나의 .go 파일이있는 경우)에서 시작하여 패키지를 조회하려고 시도하기 때문에 작동합니다.

참고 :이 기능을 사용하면 패키지에 대한 “모든 종속성 코드”를 자신의 프로젝트 디렉터리에 넣을 수 있으므로 모든 빌드에 대해 항상 동일한 종속성 버전을 얻을 수 있으므로 공급 업체와 더 많은 작업을 수행 할 수 있습니다. python의 npm 또는 pip와 비슷하지만 프로젝트에 종속성을 수동으로 복사해야합니다.

이 기능에 대한 자세한 내용을 보려면 여기를 찾아보십시오.

공급 업체 폴더 이해 및 사용 by Daniel Theophanes

Lucas Fernandes da Costa의 Go 종속성 관리 이해

당신이나 다른 누군가가 도움이 되었기를 바랍니다.


답변

가져 오기 경로는 $GOPATH$GOROOT환경 변수에 상대적 입니다. 예를 들면 다음과 같습니다 $GOPATH.

GOPATH=/home/me/go

/home/me/go/src/lib/common및 에있는 패키지 /home/me/go/src/lib/routers는 각각 다음 과 같이 가져옵니다.

import (
    "lib/common"
    "lib/routers"
)


답변

로컬 패키지는 이동 중에 성가신 문제입니다.

우리 회사의 일부 프로젝트에서는 하위 패키지를 전혀 사용하지 않기로 결정했습니다.

  • $ glide install
  • $ go get
  • $ go install

모두 작동합니다.

일부 프로젝트의 경우 하위 패키지를 사용하고 전체 경로로 로컬 패키지를 가져옵니다.

import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage

그러나이 프로젝트를 포크하면 하위 패키지는 여전히 원본을 참조합니다.


답변