Inhaltsverzeichnis
Richtige Antwort
Heim Backend-Entwicklung Golang go build funktioniert nicht, wenn es mit Workspace verwendet wird

go build funktioniert nicht, wenn es mit Workspace verwendet wird

Feb 08, 2024 pm 09:06 PM
go语言

与工作区一起使用时 go build 不起作用

php-Editor Banana möchte Ihnen ein häufiges Problem vorstellen, nämlich dass der Befehl „go build“ bei Verwendung des Arbeitsbereichs nicht ordnungsgemäß funktioniert. Dieses Problem kann Entwickler verwirren, da der Arbeitsbereich ein sehr wichtiges Konzept in der Go-Sprache ist und die Unfähigkeit, den Go-Build-Befehl ordnungsgemäß zu verwenden, den Entwicklungsprozess ernsthaft beeinträchtigen wird. Im folgenden Artikel werden wir die Ursache dieses Problems eingehend analysieren und Lösungen bereitstellen, die Entwicklern helfen, dieses Problem erfolgreich zu lösen.

Frageninhalt

Das Folgende ist die Struktur meines Golang-Codes,

├── go.work
├── moda
│   ├── go.mod
│   └── main.go
├── go.mod
└── modb
    └── main.go
Nach dem Login kopieren

Das Problem ist, dass ich nur Binärdateien für ein einzelnes Modul erstellen kann. Beim Erstellen anderer Module funktioniert es nur, wenn ich die anderen Module in go.work auskommentiere

Mein go.work ist wie folgt,

go 1.19
use (
    ./moda
    .
)
Nach dem Login kopieren

Wenn ich also go.work oben verwende, um wie folgt zu erstellen, funktioniert es einwandfrei,

go build -o test-binary -modfile ./moda/go.mod ./moda

Aber wenn ich versuche, für mein anderes Modul (d. h. modb/) zu bauen, wie unten gezeigt,

go build -o test-binary1 -modfile ./go.mod ./modb

Ich habe den folgenden Fehler festgestellt:

directory modb is contained in a module that is not one of the workspace modules listed in go.work. you can add the module to the workspace using go work use .
Nach dem Login kopieren

Ich habe es mit go 工作 use versucht, aber ich stehe immer noch vor dem gleichen Problem. Kann mir jemand helfen, dieses Problem zu lösen?

Edit 1:

Ich hatte ein Projekt, das mehrere go.mod-Dateien erforderte, um die Abhängigkeiten von Haupt- und Untermodulen zu trennen, und da begann ich, etwas über Go-Arbeitsbereiche zu lernen, die sehr gut zu meinem Anwendungsfall passten.

Meine Projektstruktur ist die gleiche wie oben erwähnt,

├── go.work
├── submodule
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── mainmodule
    └── main.go
├── go.mod
├── go.sum
Nach dem Login kopieren

Wenn Sie nun die ausführbare Datei für ein Submodul erstellen, funktioniert go build einwandfrei, aber wenn Sie die ausführbare Datei für das Hauptmodul erstellen, werden die in submodule/go.mod vorhandenen Importe auch zur ausführbaren Datei des Hauptmoduls hinzugefügt. Ich habe das auch mit go build -n verifiziert.

Um das Hinzufügen von Submodulimporten zur ausführbaren Datei des Hauptmoduls zu vermeiden, habe ich -modfile verwendet, aber damit kann ich nur die ausführbare Datei für das Submodul und nicht für das Hauptmodul erstellen.

Github-Quellcode

ps: Obwohl ich Beispielcode in Github hinzugefügt habe, kann ich das gleiche Problem nicht reproduzieren (Untermodulimporte werden zum Hauptmodul hinzugefügt). Ich bin mir nicht sicher, ob es an den von mir verwendeten Importen liegt


Richtige Antwort


Nachher Bei der Diskussion mit @arigatomanga haben wir herausgefunden, dass die Verwirrung durch die Minimum Version Selection (mvs) im Arbeitsbereich verursacht wird. Ein Arbeitsbereich ist eine Sammlung von Modulen auf der Festplatte, die als Hauptmodul verwendet wird, wenn Minimum Version Selection (mvs) (Reference) ausgeführt wird. Dank mvs können Module, die mit aktiviertem Arbeitsbereichsmodus erstellt wurden, andere abhängige Module verwenden als Module, die mit deaktiviertem Arbeitsbereichsmodus erstellt wurden.

Dies ist das dokumentierte Verhalten des Arbeitsbereichs und es gibt derzeit kein Problem.

Update: Nachfolgend finden Sie die ursprüngliche Antwort, wobei der Schwerpunkt auf der -modfile-Flagge liegt. Im Arbeitsbereichsmodus in go1.21 wird dieses Flag abgelehnt.

Im Go-Tool ist ein Fehler aufgetreten. Ich habe dieses Problem gerade hier gemeldet.

Die Fehlermeldung in go1.20 ist anders und immer noch irreführend:

go: module example.com/m1 appears multiple times in workspace
Nach dem Login kopieren

Der Unterschied wurde durch Commit eingeführt cmd/go/internal/modload: Beim Duplizieren von Modulpfaden zwischen Modulen in go.work wurde ein Fehler zurückgegeben, aber die Grundursache ist dieselbe: Im Arbeitsbereichsmodus wurde das -modfile-Flag nicht behoben .

Update: Der folgende Abschnitt ist derzeit nicht relevant. Bevor wir verstehen, was MVC ist, ist der Versuch, MVS mit der Flagge -modfile zu unterdrücken, ein gescheiterter Versuch.

Im Problembericht habe ich vorgeschlagen, die -modfile-Flagge im Arbeitsbereichsmodus zu blockieren. Aber Sie haben in den Kommentaren gesagt, dass Sie diese Flagge brauchen.

Der Grund für die Verwendung von -modfile 的原因是如果我为 ./src 构建二进制文件,即使在 ./moda 中存在的模块也会作为 ./src ist, dass, wenn ich eine Binärdatei für ./src erstelle, sogar die in ./moda vorhandenen Module als ./src code> wird als Teil der Binärdatei heruntergeladen und geladen, obwohl sie nicht enthalten sein sollten

Aber laut der cmd/go-Dokumentation :

-modfile-Datei

Lesen (und möglicherweise schreiben) Sie im modulbewussten Modus alternative go.mod Datei anstelle einer Datei im Modulstammverzeichnis. Eine Person mit Namen „go.mod“ muss noch vorhanden sein, um das Modul-Root zu ermitteln Verzeichnis, aber auf das Verzeichnis wurde nicht zugegriffen. Wenn -modfile angegeben ist, Verwendet auch eine alternative go.sum-Datei: Ihr Pfad wird von abgeleitet -modfile-Flag, indem die Erweiterung „.mod“ gekürzt und „.sum“ angehängt wird.

Das Flag

-modfile 标志用于替换模块根目录中的 go.mod wird verwendet, um die Datei go.mod im Modulstammverzeichnis zu ersetzen. Aber in Ihrem Beispiel haben Sie dieselbe Datei angegeben wie im Modulstammverzeichnis. Also ich verstehe es nicht ganz. Können Sie Ihre Frage aktualisieren, um diesen Teil näher zu erläutern? Demo ist besetzt!

Das obige ist der detaillierte Inhalt vongo build funktioniert nicht, wenn es mit Workspace verwendet wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Apr 02, 2025 pm 02:03 PM

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Apr 02, 2025 pm 04:12 PM

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Apr 02, 2025 pm 12:57 PM

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Warum gibt es bei Verwendung von SQL.Open keinen Fehler an, wenn DSN leer ist? Warum gibt es bei Verwendung von SQL.Open keinen Fehler an, wenn DSN leer ist? Apr 02, 2025 pm 12:54 PM

Warum meldet der DSN bei Verwendung von SQL.Open keinen Fehler? In Go Language, Sql.open ...

See all articles