Laden Sie lokal erstellte Pakete mit Go Module

Ich fing an, Go zu lernen. Ich lerne mit einem Buch, aber im Grunde ist die Version alt. Daher sind die meisten Dateien nicht mit dem Go-Modul strukturiert.

Es scheint jedoch der Trend zu sein, Module in zukünftigen Versions-Upgrades zu verwenden. Selbst ein Anfänger wollte sich mit Module entwickeln, also war ich verrückt, aber es fiel mir schwerer als ich dachte ...

Insbesondere fiel es mir schwer, nicht zu wissen, wie ein lokal erstelltes Paket in eine andere Datei importiert werden kann. Ich habe beschlossen, einen Artikel zu schreiben, um die Anzahl der Personen zu verringern, die unter demselben Fehler leiden.

Was ist das Go-Modul?

Ein Paketverwaltungstool. Vor Go 1.11 konnten Sie lokal erstellte Pakete nicht verarbeiten, ohne den Quellcode unter "$ GOPATH / src /" zu platzieren. Wenn Sie jedoch "go module" verwenden, können Sie Pakete aus jedem Verzeichnis verwalten. Es scheint, dass es möglich geworden ist. Ist es so etwas wie package.json für node? Daher ist es möglich, ein Projekt zu erstellen, ohne vom Pfad der Umgebungsvariablen abhängig zu sein.

Einführung

Version

❯ go version
go version go1.15.3 darwin/amd64

Bitte setzen Sie GO111MODULE auf on oder auto in go env Ich habe es weiter gemacht.

❯ go env -w GO111MODULE=on
❯ go env
GO111MODULE="on"

Die Dateistruktur sieht so aus. Der Code selbst ist ziemlich einfach.

Ich war süchtig nach der Tatsache, dass jedes Paket ein go.mod erfordert ...

go_module/
 ├ hello/
 ├  └ hello.go
 ├  └ hello_test.go
 ├  └ go.mod
 ├ goodbye/
 │ └ goodbye.go
 │ └ go.mod
 └ main/
   └ main.go
   └ go.mod

Machen Sie zuerst jedes Paket package hello

hello.go


package hello

func Hello() string {
	return "Hello World"
}

Ich werde vorerst auch einen Test machen.

hello_test.go


package hello

import (
	"testing"
)

func TestHello(t *testing.T) {
	got := Hello()
	want := "Hello World"

	if got != want {
		t.Errorf("got %q want %q", got, want)
	}
}

package goodbye

goodbye.go


package goodbye

func Goodbye() string {
	return "Goodbye!!"
}

package main

main.go


package main

import (
	"fmt"
	"goodbye"
	"hello"
)

func main() {
	fmt.Println(hello.Hello())
	fmt.Println(goodbye.Goodbye())
}

Nachdem der Quellcode in Ordnung ist, starten wir main.

❯ go run main.go
main.go:5:2: package goodbye is not in GOROOT (/usr/local/Cellar/go/1.15.3/libexec/src/goodbye)
main.go:6:2: package hello is not in GOROOT (/usr/local/Cellar/go/1.15.3/libexec/src/hello)

Sie werden wütend, wenn Sie nicht das Paket der Datei haben, die Sie importieren. Erstellen Sie Module in allen Verzeichnissen. Es scheint, dass das Modul nicht erstellt werden kann, ohne in jedes Verzeichnis zu wechseln.

❯ go mod init main
go: creating new go.mod: module main

❯ cd hello && go mod init hello
go: creating new go.mod: module hello

❯ cd ../goodbye && go mod init goodbye
go: creating new go.mod: module goodbye

Beginnen wir damit

❯ go run main.go 
main.go:5:2: package goodbye is not in GOROOT (/usr/local/Cellar/go/1.15.3/libexec/src/goodbye)
main.go:6:2: package hello is not in GOROOT (/usr/local/Cellar/go/1.15.3/libexec/src/hello)

Du bist immer noch wütend. Dies liegt daran, dass der in main.go geschriebene Import nicht mit dem zuvor erstellten Modul verknüpft ist. Es ist erforderlich, jedes Modul mit dem Pfad zu definieren, der in der zu importierenden Datei verwendet wird.

Definieren wir also das Hallo-Modul und das Abschiedsmodul in ** main go.mod ** mit relativen Pfaden.

go.mod



module main

go 1.15

replace hello => ../hello
replace goodbye => ../goodbye

Fangen wir noch einmal mit main an

❯ go run main
go: found goodbye in goodbye v0.0.0-00010101000000-000000000000
go: found hello in hello v0.0.0-00010101000000-000000000000
Hello World
Goodbye!!

Ich konnte anfangen! Schauen wir uns jetzt go.mod im Paket main an.

go.mod



module main

go 1.15

replace hello => ../hello

replace goodbye => ../goodbye

require (
	goodbye v0.0.0-00010101000000-000000000000
	hello v0.0.0-00010101000000-000000000000
)

erfordern wurde automatisch hinzugefügt. Dies scheint die Version des abhängigen Moduls zu sein, die mit package-json.lock in package.json identisch ist. Diesmal ist es ein lokales Modul, aber wenn Sie das Modul auf Github importieren, wird die Version so herauskommen.

require github.com/aws/aws-lambda-go v1.13.2

Dieses Mal habe ich versucht, es möglich zu machen, lokale Pakete mit dem go-Modul auf nette Weise zu importieren. Wenn es einen guten Weg gibt, lass es mich wissen!

Nachtrag

Wenn die Paketstruktur wie folgt ist, kann go.mod nur main sein. Bei dieser Konfiguration enthält das Hauptpaket das Hallo-Paket und das Abschiedspaket.

go_module/
 ├ hello/
 ├  └ hello.go
 ├  └ hello_test.go
 ├ goodbye/
 │ └ goodbye.go
 └ main.go
 └ go.mod

Beschreiben Sie als Punkt den Pfad von main beim Importieren mit main.go.

main.go


package main

import (
	"fmt"
	"main/goodbye"
	"main/hello"
)

func main() {
	fmt.Println(hello.Hello())
	fmt.Println(goodbye.Goodbye())

Jetzt können Sie go run main starten! Vielen Dank, dass Sie @nobonobo! !!

Referenzseite https://qiita.com/uchiko/items/64fb3020dd64cf211d4e https://takeai.silverpigeon.jp/handling-local-packages-with-go-mod/

Recommended Posts

Laden Sie lokal erstellte Pakete mit Go Module
Schritte zum lokalen Installieren eines geklonten Git-Pakets mit pip
So fügen Sie ein Paket mit PyCharm hinzu
Erstellt eine Reise von Darts mit Python (Nachrichten)
Starten Sie einen temporären http-Server lokal mit Pytest
Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei
Ein Memo, das in einem Paket erstellt und in PyPI registriert wurde
Einfache Aufgabenliste, erstellt mit Python + Django
Konfigurieren Sie ein Modul mit mehreren Dateien in Django
Versuchen Sie, eine Karte mit Pythons Folium-Paket zu zeichnen
Python mit Go
Ein Hinweis auf Missverständnisse beim Versuch, das gesamte selbst erstellte Modul mit Python3 zu laden
Eine Geschichte über einen Fehler beim Laden eines TensorFlow-Modells, das lokal mit Google Colab erstellt wurde
Erstellt ein Modul zur Überwachung von Datei- und URL-Aktualisierungen
[Linux] [Kernelmodul] Erstellen und laden Sie ein einfaches ladbares Kernelmodul
Laden Sie das gleichnamige Modul an einer anderen Stelle
Stellen Sie eine mit Streamlit erstellte Web-App für Heroku bereit