Ich habe verwendet, GOPATH
aber für dieses aktuelle Problem, mit dem ich konfrontiert bin, hilft es nicht. Ich möchte in der Lage sein, projektspezifische Pakete zu erstellen:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
Ich habe mehrere Möglichkeiten ausprobiert, aber wie komme ich package1.go
zur Arbeit in der binary1.go
oder der binary2.go
und so weiter?
Beispielsweise; Ich möchte in der Lage sein import "package1"
und dann laufen können go build binary1.go
und alles funktioniert einwandfrei, ohne dass der Fehler ausgelöst wird, dass das Paket nicht auf GOROOT
oder gefunden werden kann GOPATH
. Der Grund, warum ich diese Art von Funktionalität benötige, liegt in großen Projekten. Ich möchte nicht auf mehrere andere Pakete verweisen oder sie in einer großen Datei aufbewahren müssen.
.go
Dateien in einem einzelnen Verzeichnis sind Teil desselben Pakets, und Sie müssen keineimport
Dateien im selben Paket (dh im selben Verzeichnis) speichern. Sie haben erwähnt, dass Sie außerhalb von GOPATH arbeiten, einer der Funktionen des neuen Go-Modulsystems. Diese Antwort behandelt die Modulstruktur, das Importieren lokaler Pakete, das Anordnen von Paketen innerhalb eines Moduls, ob mehrere Module in einem Repository vorhanden sein sollen oder nicht usw.git/repo/to/my/project
Pfad angeben ? Ich sehe nur nicht den Grund, warum jemand dieses Verhalten wollen würde. Was passiert, wenn Sie Ihr Projekt an einen anderen Ort verschieben (z. B. Docker-Image) und alle Pfade erneut ändern müssen? Ich suche nach Antworten, warum dies so kompliziert ist.Antworten:
Zusammenfassung des Abhängigkeitsmanagements:
vgo
Wenn Ihre Go-Version lautet:x >= go 1.11
dep
odervendor
wenn Ihre go-Version ist:go 1.6 >= x < go 1.11
x < go 1.6
Bearbeiten 3: Go 1.11 verfügt über eine Funktion ,
vgo
die wird ersetzendep
.Informationen zur Verwendung
vgo
finden Sie in der Dokumentation zu Modulen . TLDR unten:Diese Methode erstellt eine Datei, die
go.mod
in Ihrem Projektverzeichnis aufgerufen wird . Sie können dann Ihr Projekt mit erstellengo build
. WennGO111MODULE=auto
festgelegt, kann Ihr Projekt nicht ausgeführt werden$GOPATH
.Bearbeiten 2: Die Vendoring-Methode ist weiterhin gültig und funktioniert ohne Probleme.
vendor
ist aus diesem Grund weitgehend ein manueller Prozessdep
undvgo
wurde erstellt.Edit 1: Während mein alter Weg funktioniert, ist es nicht mehr der "richtige" Weg, es zu tun. Sie verwenden sollten Anbieter Fähigkeiten,
vgo
oderdep
(bis jetzt), die standardmäßig in Go 1.6 aktiviert sind; siehe . Grundsätzlich fügen Sie Ihre "externen" oder "abhängigen" Pakete in einemvendor
Verzeichnis hinzu. Nach der Kompilierung verwendet der Compiler diese Pakete zuerst.Gefunden. Ich war in der Lage Import lokale Paket mit
GOPATH
durch einen Unterordner zu erstellenpackage1
und dann mit dem Importimport "./package1"
inbinary1.go
undbinary2.go
Skripte wie folgt aus :binary1.go
Meine aktuelle Verzeichnisstruktur sieht also so aus:
Ich sollte auch beachten, dass relative Pfade (zumindest in go 1.5) ebenfalls funktionieren; beispielsweise:
quelle
import "../package1"
Es gibt kein "lokales Paket". Die Organisation von Paketen auf einer Festplatte ist orthogonal zu allen Eltern-Kind-Beziehungen von Paketen. Die einzige echte Hierarchie, die von Paketen gebildet wird, ist der Abhängigkeitsbaum, der im allgemeinen Fall den Verzeichnisbaum nicht widerspiegelt.
Benutz einfach
und kämpfe nicht ohne guten Grund gegen das Build-System. Das Speichern eines Dutzend Zeichen pro Import in einem nicht trivialen Programm ist kein guter Grund, da beispielsweise Projekte mit relativen Importpfaden nicht abrufbar sind.
Das Konzept der Importpfade hat einige wichtige Eigenschaften:
All dies wird durch die Verwendung relativer Importpfade ruiniert. TU es nicht.
PS: Es gibt nur wenige Stellen im Legacy-Code in Go-Compilertests, die relative Importe verwenden. ATM, dies ist der einzige Grund, warum relative Importe überhaupt unterstützt werden.
quelle
import "myproject/packageN"
.myproject
ist der Ordnername, der mein Projekt enthält?Vielleicht versuchen Sie, Ihr Paket zu modularisieren. Ich gehe davon aus
package1
und bin in gewisserpackage2
Weise Teil desselben Pakets, aber aus Gründen der Lesbarkeit teilen Sie diese in mehrere Dateien auf.Wenn der vorherige Fall Ihr Fall wäre, könnten Sie denselben Paketnamen in diesen Mehrfachdateien verwenden, und es wäre so, als ob es dieselbe Datei gäbe.
Dies ist ein Beispiel:
add.go
subtrahieren.go
donothing.go
Ich bin kein Go-Experte und dies ist mein erster Beitrag in StackOveflow. Wenn Sie also einen Rat haben, wird er gut angenommen.
quelle
Ich habe ein ähnliches Problem und die Lösung, die ich derzeit verwende, verwendet Go 1.11-Module. Ich habe die folgende Struktur
Und ich kann Paket1 und Paket2 aus Projekt1 und Projekt2 mithilfe von importieren
Nach dem Laufen
go mod init projects
. Ich kanngo build
aus den Verzeichnissen project1 und project2 oder aus dem Projektverzeichnis verwendengo build -o project1/exe project1/*.go
.Der Nachteil dieser Methode ist, dass alle Ihre Projekte dieselbe Abhängigkeitsliste in go.mod verwenden. Ich bin immer noch auf der Suche nach einer Lösung für dieses Problem, aber es sieht so aus, als wäre es von grundlegender Bedeutung.
quelle
Seit der Einführung von go.mod denke ich, dass sowohl die lokale als auch die externe Paketverwaltung einfacher wird. Mit go.mod ist es auch möglich, ein go-Projekt außerhalb des GOPATH durchzuführen.
Lokales Paket importieren:
Erstellen Sie ein Ordner- Demoprojekt und führen Sie den folgenden Befehl aus, um die Datei go.mod zu generieren
go mod init demoproject
Ich habe eine Projektstruktur wie unten im Demoprojektverzeichnis .
Fügen Sie für die Demo den folgenden Code in die Datei model.go ein .
In main.go habe ich das Mitarbeitermodell importiert, indem ich auf "demoproject / src / model" verwiesen habe.
Externe Abhängigkeit importieren:
Führen Sie einfach den
go get
Befehl im Projektverzeichnis aus.Beispielsweise:
Es sollte die Modulabhängigkeit in der Datei go.mod enthalten
https://blog.golang.org/using-go-modules
quelle
can't load package: package .: no Go files in...
(Gehe in den Ordner von go.mod)Um Ihrem Projekt ein "lokales" Paket hinzuzufügen, fügen Sie einen Ordner hinzu (z. B. "Paketname"). Und legen Sie Ihre Implementierungsdateien in diesem Ordner ab.
Wenn
package main
Sie dies tun:Wo
package_name
ist der Ordnername und er muss mit dem Paketnamen übereinstimmen, der in den Dateien Whatever_name1.go und Whatever_name2.go verwendet wird. Mit anderen Worten, alle Dateien mit einem Unterverzeichnis sollten vom selben Paket sein.Sie können weitere Unterverzeichnisse weiter verschachteln, solange Sie beim Import den gesamten Pfad zum übergeordneten Ordner angeben.
quelle
package myproject/package_name is not in GOROOT (/usr/lib/go-1.14/src/myproject/package_name)
Sie können verwenden
replace
foo / go.mod
foo / main.go
bar / go.mod
bar / fn.go
Das Importieren eines lokalen Pakets entspricht dem Importieren eines externen Pakets
außer in der Datei go.mod ersetzen Sie diesen externen Paketnamen durch einen lokalen Ordner.
Der Pfad zum Ordner kann vollständig oder relativ "/ path / to / bar" oder "../bar" sein.
https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive https://thewebivore.com/using-replace-in-go-mod-to-point -zu-Ihrem-lokalen-Modul /
quelle