Estou trabalhando em um código de exemplo que desejo localizar.
Na main.go
declaração de importação original era:
import (
"log"
"net/http"
"github.com/foo/bar/myapp/common"
"github.com/foo/bar/myapp/routers"
)
Agora eu tenho common
e routers
pacote em/home/me/go/src/myapp
Então, converti a instrução import para:
import (
"log"
"net/http"
"./common"
"./routers"
)
Mas quando eu corro go install myapp
, recebo estes erros:
can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package
Além disso, quando uso common
e em routers
vez de ./common
e ./routers
na instrução de importação, obtenho:
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)
Como posso consertar isso?
Respostas:
Bem, eu descobri o problema. Basicamente, o caminho inicial do Go para importação é
$HOME/go/src
Então, eu só precisava adicionar
myapp
na frente dos nomes dos pacotes, ou seja, a importação deveria ser:import ( "log" "net/http" "myapp/common" "myapp/routers" )
fonte
myapp
é uma má ideia, por exemplo, se você alterar o nome do projeto, toda a importaçãogo mod init <module_name>
e então apenasimport "<module_name>/<pkg_name>"
.Se estiver usando o Go 1.5 acima, você pode tentar usar o recurso de venda . Ele permite que você coloque seu pacote local na pasta do fornecedor e importe-o com um caminho mais curto. No seu caso, você pode colocar sua pasta comum e de roteadores dentro da pasta vendor para que seja como
myapp/ --vendor/ ----common/ ----routers/ ------middleware/ --main.go
e importe assim
import ( "common" "routers" "routers/middleware" )
Isso funcionará porque Go tentará pesquisar seu pacote começando no diretório do fornecedor do seu projeto (se houver pelo menos um arquivo .go) em vez de $ GOPATH / src.
Para sua informação: você pode fazer mais com o fornecedor, porque este recurso permite que você coloque "todo o código de sua dependência" para um pacote dentro do diretório do seu próprio projeto, de forma que ele possa sempre obter as mesmas versões de dependências para todas as compilações. É como npm ou pip em python, mas você precisa copiar manualmente suas dependências para seu projeto ou, se quiser tornar mais fácil, tente procurar o governador de Daniel Theophanes
Para saber mais sobre esse recurso, tente procurar aqui
Compreendendo e usando a pasta de fornecedores por Daniel Theophanes
Noções básicas sobre Go Dependency Management por Lucas Fernandes da Costa
Espero que você ou outra pessoa o considere útil
fonte
Importação caminhos são relativos aos seus
$GOPATH
e$GOROOT
variáveis de ambiente. Por exemplo, com o seguinte$GOPATH
:GOPATH=/home/me/go
Pacotes localizados em
/home/me/go/src/lib/common
e/home/me/go/src/lib/routers
são importados respectivamente como:import ( "lib/common" "lib/routers" )
fonte
go install
pacotes que usam importações relativas.$GOPATH/src
.O pacote local é um problema irritante em go.
Para alguns projetos em nossa empresa, decidimos não usar subpacotes.
$ glide install
$ go get
$ go install
Todo o trabalho.
Para alguns projetos, usamos subpacotes e importamos pacotes locais com o caminho completo:
import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage
Mas se bifurcarmos este projeto, os subpacotes ainda se referem ao original.
fonte