Charger les packages créés localement avec le module Go

J'ai commencé à étudier le Go. J'étudie avec un livre, mais fondamentalement la version est ancienne. Par conséquent, la plupart des fichiers ne sont pas structurés à l'aide du module Go.

Cependant, il semble que la tendance sera d'utiliser Module dans les futures mises à jour de version. Donc, même un débutant voulait développer en utilisant Module, donc j'étais fou, mais j'ai eu plus de mal que je ne le pensais ...

Surtout, j'ai eu du mal à ne pas savoir comment importer un package créé localement dans un autre fichier. J'ai décidé d'écrire un article pour réduire le nombre de personnes qui souffrent de la même erreur.

Qu'est-ce que le module Go?

Un outil de gestion de colis. Avant Go 1.11, vous ne pouviez pas gérer les packages créés localement sans mettre le code source sous $ GOPATH / src /, mais si vous utilisez go module, vous pouvez gérer les packages depuis n'importe quel répertoire. Il semble que cela soit devenu possible. Est-ce quelque chose comme package.json pour node? Par conséquent, il est possible de créer un projet sans dépendre du chemin des variables d'environnement.

introduction

Version

❯ go version
go version go1.15.3 darwin/amd64

Veuillez régler GO111MODULE sur on ou auto dans go env Je le faisais.

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

La structure du fichier ressemble à ceci. Le code lui-même est assez simple.

J'étais accro au fait que chaque paquet nécessite un go.mod ...

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

Tout d'abord, faites chaque paquet package hello

hello.go


package hello

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

Je vais également faire un test pour le moment.

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())
}

Maintenant que le code source est OK, commençons 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)

Vous vous fâchez si vous n'avez pas le package du fichier que vous importez. Créez des modules dans tous les répertoires. Il semble que le module ne peut pas être créé sans aller dans chaque répertoire.

❯ 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

Commençons par ça

❯ 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)

Tu es toujours en colère. En effet, l'importation écrite dans main.go n'est pas liée au module créé précédemment. Il est nécessaire de définir chaque module avec le chemin utilisé dans le fichier en cours d'importation.

Définissons donc le module hello et le module goodbye dans ** main go.mod ** avec des chemins relatifs.

go.mod



module main

go 1.15

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

Commençons à nouveau

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

J'ai pu commencer! Jetons maintenant un œil à go.mod dans le package main.

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
)

require a été ajouté automatiquement. Cela semble être la version du module dépendant, qui est la même que package-json.lock dans package.json. Cette fois, c'est un module local, mais si vous importez le module sur github, la version sortira comme ceci.

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

Cette fois, j'ai essayé de rendre possible l'importation de paquets locaux avec le module go d'une manière agréable. S'il y a un bon moyen, faites-le moi savoir!

Postscript

Si la structure du package est la suivante, go.mod ne peut être que principal. Avec cette configuration, le package principal contient le package hello et le package goodbye.

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

En guise de point, veuillez décrire le chemin depuis main lors de l'importation avec main.go.

main.go


package main

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

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

Vous pouvez maintenant démarrer go run main! Merci @nobonobo! !!

Site de référence https://qiita.com/uchiko/items/64fb3020dd64cf211d4e https://takeai.silverpigeon.jp/handling-local-packages-with-go-mod/

Recommended Posts

Charger les packages créés localement avec le module Go
Étapes pour installer un package cloné Git localement avec pip
Comment ajouter un package avec PyCharm
Créé un voyage de fléchettes avec python (news)
Démarrez un serveur http temporaire localement avec Pytest
Créer un fichier exécutable GUI créé avec tkinter
Un mémo créé dans un package et enregistré dans PyPI
Liste de tâches simple créée avec Python + Django
Configurer un module avec plusieurs fichiers dans Django
Essayez de dessiner une carte avec le package folium de Python
Python avec Go
Une note de malentendu lors de la tentative de chargement de l'intégralité du module self-made avec Python3
Une histoire sur une erreur lors du chargement d'un modèle TensorFlow créé avec Google Colab localement
Création d'un module pour surveiller les mises à jour des fichiers et des URL
[Linux] [module de noyau] Construire et charger un module de noyau chargeable simple
Chargez le module du même nom dans un autre emplacement
Déployer une application Web créée avec Streamlit sur Heroku