web-dev-qa-db-fra.com

Comment utiliser un module qui est en dehors de "GOPATH" dans un autre module?

J'ai créé une bibliothèque comme module pour un usage personnel en dehors de "GOPATH" dans le dossier "database" avec cette commande "go mod init database", et je ne sais pas:

  • Comment utiliser/import ce module dans un autre module?

Système d'exploitation: Windows 7, Go: v1.11

17
samadadi

La solution prête à l'emploi la plus simple et la plus efficace consiste à placer votre package/module database dans un VCS (par exemple, github.com), afin que d'autres packages (à l'intérieur d'autres modules) puissent simplement s'y référer en important ça aime:

import "github.com/someone/database"

Si vous le faites, vous n'avez même pas besoin de jouer avec le go.mod les fichiers manuellement, tout sera pris en charge par l'outil go: il reconnaîtra et résoudra automatiquement cette dépendance, téléchargera et installera le package requis, et mettra également à jour go.mod automatiquement.

Rester entièrement sur le disque local

Si vous ne voulez pas utiliser un VCS (par exemple, vous êtes juste en train d'expérimenter ou vous n'avez pas encore décidé quoi utiliser), vous pouvez toujours le faire. Le comment est détaillé dans l'officiel Go Wiki: Puis-je travailler entièrement en dehors de VCS sur mon système de fichiers local?

Vous avez donc créé un dossier database en dehors de GOPATH et vous y avez créé un module. Et vous avez créé un autre module, appelons-le main, et vous souhaitez utiliser ce package database.

Ce que vous devez faire, c'est:

  • go.mod de votre module main doit répertorier le package database comme une "exigence". Donnez un nom VCS temporaire à votre package database:

    require (
        example.com/me/database v0.0.0
    )
    
  • Vous devez indiquer à l'outil go où se trouve ce package, car le nom de package complet que nous avons utilisé n'est qu'un nom temporaire/fantaisie. Utilisez la directive replace pour que ce package database pointe vers un dossier sur votre disque local; vous pouvez utiliser des chemins absolus et relatifs:

    replace example.com/me/database => ../database
    

Et c'est tout.

Exemple de travail

Voyons un exemple de travail. Créons un module pretty. Créez un dossier pretty contenant 2 fichiers:

pretty.go:

package pretty

import "fmt"

func Pretty(v ...interface{}) {
    fmt.Println(v...)
}

go.mod (peut être créé en exécutant go mod init pretty):

module pretty

Créons maintenant un autre module principal. Créons un dossier osinf (ce peut être n'importe quoi) à côté du dossier pretty. 2 fichiers dedans:

osinf.go (notez que nous avons l'intention d'utiliser notre package/module pretty, nous l'importons par "example.com/me/pretty"):

package main

import "example.com/me/pretty"

func main() {
    pretty.Pretty("hi")
    pretty.Pretty([]int{1, 3, 5})
}

go.mod:

module main

require example.com/me/pretty v0.0.0

replace example.com/me/pretty => ../pretty

Et c'est tout.

Fonctionnement go run osinf.go dans le dossier osinf, la sortie est:

hi
[1 3 5]
34
icza