Comment utiliser des packages personnalisés


178

J'essaie de créer et d'utiliser un package personnalisé dans Go. C'est probablement quelque chose de très évident mais je ne trouve pas beaucoup d'informations à ce sujet. Fondamentalement, j'ai ces deux fichiers dans le même dossier:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Lorsque j'essaye go run main.go, j'obtiens cette erreur:

main.go:4:2: import "mylib": cannot find package

J'ai essayé de courir en go build mylib.gopremier mais il ne semble rien faire (aucun fichier généré, aucun message d'erreur). Alors une idée de comment je pourrais faire ça?


Je n'ai pas défini de variable GOPATH, seulement GOROOT.
laurent

1
exécutez go installsous le répertoire de mylibfirst et réessayez.
Joe

1
Voir aussi ce fil .
kostix

@Joe, cela ne peut toujours pas fonctionner en exécutant "go install" à l'intérieur
hunter_tech

Réponses:


175

Tout d'abord, assurez-vous de lire et de comprendre le document «Comment écrire du code Go» .

La réponse réelle dépend de la nature de votre "package personnalisé".

S'il est destiné à un usage général, envisagez d'utiliser ce que l'on appelle la "disposition de code Github" . En gros, vous faites de votre bibliothèque un go getprojet -table séparé .

Si votre bibliothèque est à usage interne, vous pouvez procéder comme suit:

  1. Placez le répertoire contenant les fichiers de la bibliothèque sous le répertoire de votre projet.
  2. Dans le reste de votre projet, référez-vous à la bibliothèque en utilisant son chemin relatif à la racine de votre espace de travail contenant le projet.

Démontrer:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Maintenant, au niveau supérieur main.go, vous pourriez import "myproject/mylib"et cela fonctionnerait bien.


1
Si je crée un nouveau projet (myproject2) sous src /, comment puis-je importer mylib?
Kiril

2
@Kiril, vous voulez dire, comment importez-vous mylibdans le code de myproject2? Ensuite, la réponse est "en utilisant import "myproject/mylib"- l'idée est que Go recherche les chemins importés sous chaque répertoire qu'il extrait de la GOPATHvariable d'environnement (ils sont appelés" espaces de travail "), mais cette recherche n'est (heureusement) pas récursive, donc ces chemins sont effectivement "ancrés" à leurs espaces de travail respectifs.
kostix

4
Une autre lecture incontournable: "Noms des packages" .
kostix

1
@MatthiasSommer, généralement - en extrayant ce mylib dans un package commun utilisé par chaque microservice. La manière exacte dont «utilise» est définie dépend de votre flux de travail préféré. Dans le développement de niveau entreprise, la vente est généralement utilisée, mais avec les go moddéveloppements récents , un module peut être la réponse (et go modprend également en charge la vente de modules).
kostix

1
@LeiYang, "le package à importer" est un répertoire contenant un ou plusieurs fichiers source Go. Quant à "comment créer un package dans un fichier .lib" puis importer le fichier lib "- la réponse dépend de ce que vous avez vraiment l'intention de demander. Si vous êtes préoccupé par la vitesse de compilation, alors n'ayez pas peur: la chaîne d'outils Go met en cache tous les résultats de construction sur une base par paquet. Si, à la place, vous vouliez demander s'il est possible de compiler et de distribuer un paquet compilé uniquement binaire, alors la réponse est non .
kostix

68

Pour ce type de structure de dossiers:

main.go
mylib/
  mylib.go

Le moyen le plus simple est d'utiliser ceci:

import (
    "./mylib"
)

1
Cela ne fonctionne plus dans les versions récentes de go car le package ne sera pas trouvé. L'importation correcte serait foo/mylib(en supposant que le dossier contenant main.go est foo).
nemo

6
@nemo, avec la dernière version de go, j'utilise toujours "./mylib" et ça marche.
laurent

3
En utilisant go 1.2 et je suis d'accord avec @ this.lau_
canadadry

8
Sachez que cela fait une go installpause. Si vous créez un projet autonome que vous voulez que les gens téléchargent et exécutent go build, c'est très bien - cependant, j'utiliserais la "disposition de code Github" mentionnée ci-dessus (même si elle est hors bitbucket, ou similaire) si vous voulez une go installassistance complète .
photoionisé le

Je suggère de ne pas utiliser de cette façon. Ça va casser godef. godef il ne comprend pas "." importations
King Jk

6

Pour un projet hébergé sur GitHub, voici ce que les gens font habituellement :

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...

6

Je suis un programmeur expérimenté, mais assez nouveau dans le monde de Go! Et j'avoue avoir rencontré peu de difficultés pour comprendre Go ... J'ai rencontré ce même problème en essayant d'organiser mes fichiers go dans des sous-dossiers. La façon dont je l'ai fait:

GO_Directory (celui affecté à $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

Sur le fichier MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

sur le fichier MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(J'utilise Go 1.9 sur Ubuntu 16.04)

Et rappelez-vous les gars, je suis novice sur Go. Si ce que je fais est une mauvaise pratique, faites-le moi savoir!


3

une autre solution:
ajouter src/myprojectà $ GOPATH.

Ensuite import "mylib"compilera.


cela ne fonctionnera pas pour les chemins accessibles tels que les packages hébergés sur github.
Gustav

1

J'essaye tellement de manières mais la meilleure j'utilise go.mod et mets

module nameofProject.com

puis j'importe du même projet que j'utilise

import("nameofProject.com/folder")

C'est très utile de créer un projet n'importe où

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.