2015-10-26 18 views
5

Cerco di capire come organizzare il go code usando i pacchetti "interni". Mi permetta di mostrare ciò che la struttura che ho:Come utilizzare i pacchetti "interni"?

project/ 
    internal/ 
    foo/ 
     foo.go # package foo 
    bar/ 
     bar.go # package bar 
    main.go 

# here is the code from main.go 
package main 

import (
    "project/internal/foo" 
    "project/internal/bar" 
) 

project/ è al di fuori da un albero GOPATH. Qualunque percorso provo a importare da main.go non funziona nulla, l'unico caso funzionante è import "./internal/foo|bar". Penso di fare qualcosa di sbagliato o di ottenere un'idea del pacchetto "interno" in generale. Qualcuno potrebbe chiarire le cose, per favore?

UPDATE

L'esempio precedente è corretto l'unica cosa ho bisogno era di mettere cartella project/ sotto $GOPATH/src. Quindi la cosa è il percorso di importazione come il project/internal/foo|bar è praticabile se lo importiamo solo dal sottostruttura project/ e non dall'esterno.

+5

Non è possibile importare i pacchetti che non sono in '$ GOPATH/src'. Prova a creare un pacchetto 'project/baz', non sarai in grado di importarlo. Metti tutti i tuoi progetti in GOPATH. –

+0

Cosa succede se non desidero inserire tutti i progetti in GOPATH? –

+2

Ecco come funzionano gli strumenti go. Se si desidera utilizzare un pacchetto, è necessario che sia in GOPATH. – JimB

risposta

6

I pacchetti devono essere posizionati nel numero $GOPATH per poter essere importati. L'esempio che hai fornito con import "./internal/foo|bar" funziona perché esegue un'importazione locale. internal fa in modo che il codice che non condivide una directory radice comune nella directory internal non possa importare i pacchetti all'interno di internal.

Se si mette tutto questo nella vostra gopath poi cercato di importare da una posizione diversa come OuterFolder/project2/main.go dove OuterFolder contiene sia project e project2 poi import "../../project/internal/foo" fallirebbe. Fallirebbe anche come import "foo" o in qualsiasi altro modo provato per non soddisfare questa condizione;

L'importazione di un percorso contenente l'elemento “interno” non è consentita se codice l'importazione è fuori dal albero radicato al padre della directory “interno”.

Ora, se tu avessi il percorso $GOPATH/src/project allora si potrebbe fare import "foo" e import "bar" dall'interno $GOPATH/src/project/main.go e l'importazione potrebbe avere successo. Le cose che non sono contenute sotto project tuttavia non sarebbero in grado di importare foo o bar.

0

sotto modo è più scalabile, soprattutto quando si prevede di creare più file binari

github.com/servi-io/api 
├── cmd/ 
│ ├── servi/ 
│ │ ├── cmdupdate/ 
│ │ ├── cmdquery/ 
│ │ └── main.go 
│ └── servid/ 
│  ├── routes/ 
│  │ └── handlers/ 
│  ├── tests/ 
│  └── main.go 
├── internal/ 
│ ├── attachments/ 
│ ├── locations/ 
│ ├── orders/ 
│ │ ├── customers/ 
│ │ ├── items/ 
│ │ ├── tags/ 
│ │ └── orders.go 
│ ├── registrations/ 
│ └── platform/ 
│  ├── crypto/ 
│  ├── mongo/ 
│  └── json/ 

for more

Problemi correlati