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