Wie kompiliere ich ein Go-Programm, das aus mehreren Dateien besteht?

87

Ich habe ein kleines Programm, das aus drei Dateien besteht, die alle zum selben Paket (main) gehören, aber wenn ich "go build main.go" mache, ist der Build nicht erfolgreich. Wenn es nur eine Datei war (main.go), hat alles gut funktioniert. Nachdem ich mir einige Mühe gegeben habe, den Code zu trennen, kann der Compiler anscheinend nicht das Material finden, das aus main.go entnommen und in diese beiden anderen Dateien (die sich im selben Verzeichnis wie main.go befinden) eingefügt wurde. . Was zu "undefinierten" Typ "-Fehlern führt.

Wie kompiliere ich dieses Programm, das aus mehreren Dateien besteht?

Vitaly
quelle

Antworten:

85

Neuer Weg ( empfohlen ):

Bitte werfen Sie einen Blick auf diese Antwort .

Alter Weg:

Angenommen, Sie schreiben ein Programm namens myprog:

Legen Sie alle Ihre Dateien in einem Verzeichnis wie diesem ab

myproject/go/src/myprog/xxx.go

Dann myproject/gozu GOPATH hinzufügen

Und Renn

go install myprog

Auf diese Weise können Sie bei Bedarf weitere Pakete und Programme in myproject / go / src hinzufügen.

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

(Dieses Dokument wird von Neulingen immer vermisst und ist zunächst oft schlecht verstanden. Es sollte die größte Aufmerksamkeit der IMO des Go-Teams erhalten.)

Denys Séguret
quelle
5
Warum nicht das / go / loswerden und einfach myproject / src machen?
Alexander Mills
Ich gehe auch davon aus, dass "go install myprog" die Projektquelle irgendwie in den Speicherort $ GOPATH schreibt. Ist das richtig? Wenn ja, wäre es schön, diese Erklärung auch als Teil der Antwort zu haben
Alexander Mills
1
@AlexanderMills Nur kleine Projekte verwenden nur eine Technologie.
Denys Séguret
2
@ DenysSéguret Ich bin mir nicht sicher, ob ich damit einverstanden bin, aber für einfache Projekte könnte man den Go-Teil einfach fallen lassen - die Leute könnten annehmen, dass das Go-Ding notwendig ist und nicht. Sie sagen mir, was ist einfacher, das Gehen oder das Nicht-Gehen? :)
Alexander Mills
1
Ich verstehe immer noch nicht, warum diese Ordnerstruktur?
Madeo
67

Wenn Sie beispielsweise Code von main.goin trennen more.go, übergeben Sie diese Datei einfach auch an go build/ go run/ go install.

Also, wenn Sie zuvor gelaufen sind

go build main.go

du jetzt einfach

go build main.go more.go

Als weitere Information:

go build --help

Zustände:

Wenn es sich bei den Argumenten um eine Liste von GO-Dateien handelt, werden sie beim Erstellen als Liste von Quelldateien behandelt, die ein einzelnes Paket angeben.


Beachten Sie dies go buildund go installunterscheiden Sie sich go rundarin, dass die ersten beiden Zustände Paketnamen als Argumente erwarten , während letztere go-Dateien erwarten . Die ersten beiden akzeptieren jedoch auch go-Dateien wie go install.

Wenn Sie sich fragen: Build erstellt nur builddie Pakete / Dateien, erstellt installObjekt- und Binärdateien in Ihrem GOPATH und runkompiliert und führt Ihr Programm aus.

Kissaki
quelle
6
Wenn Sie nicht immer mehr Dateien hinzufügen möchten, verwenden Sie Regex mit: go run * .go
NateW
ok danke, schreibt Go immer nur eine ausführbare Datei aus? Es hält die ausführbaren Dateien nicht getrennt (wie in Java)?
Alexander Mills
@ AlexanderMills wegen Windows, ich denke, verwenden Sie nix. oder zumindest mingw.
Sergey Gorlanov
Ja, ich habe MacOS verwendet, aber vielleicht ist es Bash Version 3, die es vermasselt. Ich sollte auf Bash 4 upgraden.
Alexander Mills
29

Du könntest auch einfach rennen

go build

in Ihrem Projektordner myproject / go / src / myprog

Dann können Sie einfach tippen

./myprog

um deine App auszuführen

Poopoothegorilla
quelle
3
Die Ausgabe ist ein Go-Objekt, keine ausführbare Datei.
user2284570
@ user2284570 fügen Sie einfach die chmod +xBerechtigung für diese Datei hinzu, um sie
auszuführen
12

Seit Go 1.11+ wird GOPATH nicht mehr empfohlen. Die neue Methode verwendet Go-Module.

Angenommen, Sie schreiben ein Programm mit dem Namen simple:

  1. Erstellen Sie ein Verzeichnis:

    mkdir simple
    cd simple
  2. Erstellen Sie ein neues Modul:

    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. Legen Sie alle Ihre Dateien in diesem Verzeichnis ab.

  4. Führen Sie zum Schluss Folgendes aus:

    go run .
  5. Alternativ können Sie ein ausführbares Programm erstellen, indem Sie es erstellen:

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

Weitere Informationen finden Sie hier .

Go unterstützt seit 1.11 die hier vorgeschlagenen versionierten Module. Der erste Prototyp vgo wurde im Februar 2018 angekündigt. Im Juli 2018 landeten versionierte Module im Go-Hauptrepository. In Go 1.14 wird die Modulunterstützung als produktionsbereit angesehen, und alle Benutzer werden aufgefordert, von anderen Abhängigkeitsverwaltungssystemen auf Module zu migrieren.

Inanc Gumus
quelle
7

Sie können verwenden

go build *.go 
go run *.go

beide funktionieren auch Sie können verwenden

go build .
go run .
Tushar Saha
quelle
5

Das hängt von Ihrer Projektstruktur ab. Am einfachsten ist jedoch:

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

dann laufen ./myproject.

Angenommen, Ihre Projektstruktur sieht so aus

- hello
|- main.go

Dann gehen Sie einfach in das Projektverzeichnis und führen es aus

go build -o ./myproject

dann ./myprojectauf Shell laufen .

oder

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

Angenommen, Ihre Hauptdatei ist in einem Unterverzeichnis wie a verschachtelt cmd

- hello
|- cmd
 |- main.go

dann wirst du rennen

go run cmd/main.go
Alamin
quelle
3

Jep! Das ist sehr einfach und hier kommt die Paketstrategie ins Spiel. Meines Wissens gibt es drei Möglichkeiten. Ordnerstruktur:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 Warnung: Der Adapter kann nur das Paket main und sun Verzeichnisse enthalten

  1. Navigieren Sie zum Ordner "Adapter". Lauf:
    go build main.go
  1. Navigieren Sie zum Ordner "Adapter". Lauf:
    go build main.go
  1. Navigieren Sie zu GOPATH / src. Erkennen Sie den relativen Pfad zum Paket main, hier "myproject / adapter". Lauf:
    go build myproject/adapter

Die exe-Datei wird in dem Verzeichnis erstellt, in dem Sie sich gerade befinden.

Sayan Dey
quelle