Come compilare il programma Go composto da più file?


89

Ho un piccolo programma che consiste di tre file, tutti appartenenti allo stesso pacchetto (main), ma quando faccio "go build main.go" la build non riesce. Quando era solo un file (main.go) tutto funzionava bene. Ora che mi sono sforzato di separare il codice, sembra che il compilatore non sia in grado di trovare il materiale che è stato estratto da main.go e inserito in questi altri due file (che risiedono nella stessa directory di main.go) . Che si traduce in errori di "tipo" non definito ".

Come si compila questo programma composto da più file?

Risposte:


87

New Way ( consigliato ):

Si prega di dare un'occhiata a questa risposta .

Vecchio modo:

Supponiamo che tu stia scrivendo un programma chiamato myprog:

Metti tutti i tuoi file in una directory come questa

myproject/go/src/myprog/xxx.go

Quindi aggiungi myproject/goa GOPATH

E corri

go install myprog

In questo modo sarai in grado di aggiungere altri pacchetti e programmi in myproject / go / src, se lo desideri.

Riferimento: http://golang.org/doc/code.html

(questo documento è sempre mancato ai nuovi arrivati, e spesso all'inizio mal compreso. Dovrebbe ricevere la massima attenzione del team Go IMO)


5
perché non sbarazzarsi di / go / e fare semplicemente myproject / src?
Alexander Mills

inoltre, presumo che "go install myprog" scriva in qualche modo il sorgente del progetto nella posizione $ GOPATH? È giusto? in tal caso, sarebbe bello avere questa spiegazione anche come parte della risposta
Alexander Mills

1
@AlexanderMills Solo i piccoli progetti utilizzano una sola tecnologia.
Denys Séguret

2
@ DenysSéguret non sono sicuro di essere d'accordo con questo, ma comunque questo è per progetti semplici, potresti semplicemente abbandonare la parte go - la gente potrebbe presumere che la cosa go sia necessaria e non lo è. Mi dici, qual è più semplice, andare o non andare? :)
Alexander Mills

1
Continuo a non capire perché questa struttura di cartelle?
Madeo

68

Quando si separa il codice da main.goin, ad esempio more.go, si passa semplicemente anche quel file a go build/ go run/ go install.

Quindi, se in precedenza hai eseguito

go build main.go

ora semplicemente

go build main.go more.go

Come ulteriore informazione:

go build --help

stati:

Se gli argomenti sono un elenco di file .go, build li tratta come un elenco di file di origine che specificano un singolo pacchetto.


Si noti che go builde go installdifferiscono dal fatto go runche i primi due si aspettano i nomi dei pacchetti come argomenti, mentre i secondi si aspettano i file go . Tuttavia, i primi due accetteranno anche file go come fa go install.

Se ti stai chiedendo: build conterrà solo buildi pacchetti / file, installprodurrà file oggetto e binari nel tuo GOPATH e runcompilerà ed eseguirà il tuo programma.


6
Se non vuoi continuare ad aggiungere sempre più file, usa regex, con: go run * .go
NateW

ok grazie, Go scrive sempre un solo file eseguibile? Non tiene separati i file eseguibili (come in Java)?
Alexander Mills

@AlexanderMills a causa di Windows, penso, usa nix. o almeno mingw.
Sergey Gorlanov

sì, stavo usando MacOS, ma forse è la versione 3 di Bash che sta andando a puttane, dovrei passare a Bash 4.
Alexander Mills

30

Potresti anche correre

go build

nella cartella del tuo progetto myproject / go / src / myprog

Quindi puoi semplicemente digitare

./myprog

per eseguire la tua app


3
l'output è un oggetto go, non un eseguibile.
user2284570

@ user2284570 aggiungi solo il chmod +xpermesso per quel file di eseguirlo
dalmate

21

Dal momento che Go 1.11+, GOPATH non è più consigliato, il nuovo modo è utilizzare i moduli Go.

Supponi di scrivere un programma chiamato simple:

  1. Crea una directory:

    mkdir simple
    cd simple
    
  2. Crea un nuovo modulo:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. Metti tutti i tuoi file in quella directory.

  4. Infine, esegui:

    go run .
    
  5. In alternativa, puoi creare un programma eseguibile costruendolo:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

Per ulteriori informazioni, puoi leggere questo .

Go ha incluso il supporto per i moduli con versione come proposto qui dalla 1.11. Il prototipo iniziale di vgo è stato annunciato nel febbraio 2018. Nel luglio 2018, i moduli con versione sono arrivati ​​nel repository principale di Go. In Go 1.14, il supporto del modulo è considerato pronto per l'uso in produzione e tutti gli utenti sono incoraggiati a migrare ai moduli da altri sistemi di gestione delle dipendenze.


7

Puoi usare

go build *.go 
go run *.go

entrambi funzioneranno anche tu puoi usare

go build .
go run .

6

Dipende dalla struttura del tuo progetto. Ma la cosa più semplice è:

go build -o ./myproject ./...

quindi corri ./myproject.

Supponiamo che la struttura del tuo progetto sia simile a questa

- hello
|- main.go

quindi vai alla directory del progetto ed esegui

go build -o ./myproject

quindi esegui ./myprojectsu shell.

o

# most easiest; builds and run simultaneously
go run main.go

supponiamo che il tuo file principale sia annidato in una sottodirectory come un file cmd

- hello
|- cmd
 |- main.go

allora correrai

go run cmd/main.go

3

Sì! È molto semplice ed è qui che entra in gioco la strategia del pacchetto. ci sono tre modi per la mia conoscenza. struttura delle cartelle:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 avviso: l'adattatore può contenere solo il pacchetto main e le directory sun

  1. vai alla cartella "adapter". Correre:
    go build main.go
  1. vai alla cartella "adapter". Correre:
    go build main.go
  1. vai a GOPATH / src riconosci il percorso relativo al pacchetto principale, qui "mioprogetto / adattatore". Correre:
    go build myproject/adapter

Il file exe verrà creato nella directory in cui ti trovi attualmente.

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.