2016-02-18 22 views
17

Sono nuovo per andare e lavorare su un codice di esempio che voglio localizzare.Come importare i pacchetti locali in go?

Nella dichiarazione originale main.go importazione era:

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

ora ho common e routers pacchetto /home/me/go/src/myapp

Così ho trasformato l'istruzione import per:

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

Ma quando Corro go install myapp Ottengo questi errori:

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

Inoltre, quando uso common e routers invece di ./common e ./routers nella dichiarazione di importazione, ottengo:

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) 

Come posso risolvere questo problema?

+2

Tutte le importazioni sono "locale" a prescindere dal percorso di importazione. Vedi ["Come scrivere Go Code"] (https://golang.org/doc/code.html) per una spiegazione dettagliata. – JimB

+1

@JimB mettendo da parte i dibattiti filosofici, quello che mi interessa è come risolvere il problema di cui sopra. – Karlom

+1

Non sto cercando di fare una dichiarazione filosofica, sto letteralmente dicendo che * tutte * le importazioni si verificano nel tuo filesystem locale; non c'è mai differenza se provengono da un repository remoto o no. Non tentare di utilizzare percorsi relativi (funzionano a volte, ma sono scoraggiati) e passano attraverso il documento "Come scrivere codice Go", in particolare la sezione su ["Organizzazione codice"] (https://golang.org/). doc/code.html # Organization). – JimB

risposta

15

Beh, ho capito il problema. Fondamentalmente Go sentiero che parte per l'importazione è $HOME/go/src

Così ho solo bisogno di aggiungere myapp davanti ai nomi dei pacchetti, cioè, l'importazione dovrebbe essere:

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

I percorsi di importazione sono relativi alle variabili di ambiente $GOPATH e $GOROOT. Ad esempio, con la seguente $GOPATH:

GOPATH=/home/me/go 

Pacchetti situati in /home/me/go/src/lib/common e /home/me/go/src/lib/routers vengono importate, rispettivamente, come:

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

Sì, il primo esempio è stato il mio errore. – wlredeye

+0

Cosa intendi per percorso relativo non supportato dall'attrezzatura? – wlredeye

+0

Non è possibile "andare installare" pacchetti che utilizzano importazioni relative. – JimB

6

Se si utilizza sopra Go 1.5, puoi provare a utilizzare la funzione vending. Consente di inserire il pacchetto locale nella cartella del fornitore e importarlo con il percorso più breve. Nel tuo caso, si può mettere il comuni e router cartella all'interno fornitore cartella così sarebbe come

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

e importarlo come questo

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

Questo funziona perché Go proverà a cercare il tuo pacchetto a partire dalla directory del venditore del tuo progetto (se ha almeno un file .go) invece di $ GOPATH/src.

FYI: È possibile fare di più con il fornitore, perché questa funzione consente di inserire "tutto il codice della propria dipendenza" per un pacchetto all'interno della directory del proprio progetto in modo che sia sempre possibile ottenere le stesse versioni delle dipendenze per tutte le versioni.È come npm o pip in python, ma devi copiare manualmente le tue dipendenze nel tuo progetto, o se vuoi renderlo facile, prova a cercare govendor di Daniel Theophanes

Per ulteriori informazioni su questa funzione, prova a guardare qui

Understanding and Using Vendor Folder by Daniel Theophanes

Understanding Go Dependency Management by Lucas Fernandes da Costa

Spero che tu o qualcun altro trovate utilmente

Problemi correlati