Come utilizzare i pacchetti personalizzati


178

Sto cercando di creare e utilizzare un pacchetto personalizzato in Go. Probabilmente è qualcosa di molto ovvio ma non riesco a trovare molte informazioni al riguardo. Fondamentalmente, ho questi due file nella stessa cartella:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Quando provo a go run main.goottenere questo errore:

main.go:4:2: import "mylib": cannot find package

Ho provato a eseguire go build mylib.goprima ma non sembra fare nulla (nessun file generato, nessun messaggio di errore). Quindi hai idea di come potrei farlo?


Non ho impostato una variabile GOPATH, solo GOROOT.
laurent

1
eseguire go installnella directory di mylibprima e riprovare.
Joe,

1
Vedi anche questa discussione .
kostix,

@Joe, non può ancora funzionare eseguendo "go install" all'interno
hunter_tech

Risposte:


175

Innanzitutto, assicurati di leggere e comprendere il documento "Come scrivere il codice Go" .

La risposta effettiva dipende dalla natura del "pacchetto personalizzato".

Se è destinato ad essere di uso generale, considera di utilizzare il cosiddetto "layout del codice Github" . Fondamentalmente, rendi la tua biblioteca un go getprogetto a tabella separata .

Se la tua libreria è per uso interno, potresti andare così:

  1. Posiziona la directory con i file della libreria nella directory del tuo progetto.
  2. Nel resto del progetto, fare riferimento alla libreria utilizzando il relativo percorso relativo alla radice dell'area di lavoro contenente il progetto.

Dimostrare:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Ora, al livello più alto main.go, potresti import "myproject/mylib"e funzionerebbe bene.


1
Se creo un nuovo progetto (myproject2) in src /, come posso importare mylib?
Kiril,

2
@Kiril, intendi come importare mylibnel codice di myproject2? Quindi la risposta è "usando import "myproject/mylib"- l'idea è che Go cerca i percorsi importati in ogni directory che estrae dalla GOPATHvariabile d'ambiente (sono chiamati" aree di lavoro "), ma questa ricerca non è (fortunatamente) non ricorsiva, quindi tali percorsi sono effettivamente "ancorato" nei rispettivi spazi di lavoro.
Kostix

4
Un altro must have letto: "Nomi dei pacchetti" .
kostix,

1
@MatthiasSommer, in genere — estraendo quel mylib in un pacchetto comune utilizzato da ciascun microservizio. Esattamente come vengono definiti gli "usi", dipende dal flusso di lavoro preferito. Nello sviluppo di livello aziendale, viene generalmente utilizzato il vendoring , ma con i recenti go modsviluppi, un modulo potrebbe essere la risposta (e go modsupporta anche il vendoring di moduli).
kostix,

1
@LeiYang, "il pacchetto da importare" è una directory con uno o più file sorgente Go. Per quanto riguarda "come compilare un pacchetto in un file .lib" e quindi importare il file lib ", la risposta dipende da ciò che realmente intendevi chiedere. Se ti preoccupi della velocità di compilazione, non temere: la cache della toolchain Go . tutti i risultati costruire su una base per-package Se, invece, si voleva chiedere se è possibile compilare e distribuire un pacchetto binario solo compilato, allora la risposta è no .
kostix

68

Per questo tipo di struttura di cartelle:

main.go
mylib/
  mylib.go

Il modo più semplice è usare questo:

import (
    "./mylib"
)

1
Questo non funziona più nelle ultime versioni di go in quanto il pacchetto non verrà trovato. L'importazione corretta sarebbe foo/mylib(supponendo che la cartella contenente main.go sia foo).
nemo,

6
@nemo, con l'ultima versione di go, uso sempre "./mylib" e funziona.
laurent

3
Usando go 1.2 e sono d'accordo con @ this.lau_
canadadry il

8
Essere consapevoli del fatto che questo rende la go installrottura. Se stai costruendo un progetto autonomo su cui desideri che le persone scarichino ed eseguano go build, va bene, tuttavia, impiegherei il "layout del codice Github" menzionato sopra (anche se off bitbucket o simile) se desideri un go installsupporto completo .
fotoionizzata il

Consiglio di non usare in questo modo. Si spezzerà Godef. godef non capisce di "." importazioni
Re Jk

6

Per un progetto ospitato su GitHub, ecco cosa fanno di solito le persone :

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...

6

Sono un programmatore esperto, ma abbastanza nuovo nel mondo di Go! E confesso di aver avuto poche difficoltà a capire Go ... Ho riscontrato questo stesso problema quando ho cercato di organizzare i miei file go in sottocartelle. Il modo in cui l'ho fatto:

GO_Directory (quello assegnato a $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

Su File MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

su file MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(Sto eseguendo Go 1.9 su Ubuntu 16.04)

E ricordate ragazzi, sono novizio su Go. Se quello che sto facendo è una cattiva pratica, fammi sapere!


3

un'altra soluzione:
aggiungi src/myprojecta $ GOPATH.

Quindi import "mylib"compilerà.


questo non funzionerà per percorsi ottenibili come pacchetti ospitati da github.
Gustav,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.