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.
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.
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!
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