web-dev-qa-db-fra.com

Meilleure pratique du chemin d'importation Golang

Je travaille actuellement sur un projet privé utilisant Golang (et je suis nouveau dans ce domaine).

Mais j'ai le problème que je ne sais pas quelle est la bonne façon de définir le import path pour les paquets locaux.

J'ai le même sentiment que l'auteur de ce lien https://medium.com/@c9s/golang-the-annoying-remote-import-path-c6c7e76517e5

En bref, si je héberge un projet foo dans Github. Je me sens étrange d'utiliser github.com/levin/foo comme chemin d'importation au lieu de foo. Cela ne causerait-il pas beaucoup de travail si je transfère mes codes vers Bitbucket ou si j'héberge mon propre serveur git dans AWS? 

Et pire, je peux réécrire mon code pour changer le chemin d’importation, mais comment les gens en utilisant mon code dans leur notifier le changement de repo? Et je ne sens aucun sens de demander aux autres de mettre à jour leurs codes.

Je suis nouveau à Golang, alors n'hésitez pas à dire quelque chose comme "ta question n’est même pas valable".

7
Levin Kwong

La réponse à votre question:

Je ne sais pas quelle est la bonne façon de définir le chemin d'importation pour les packages locaux.

Comme @JimB a dit: 

Si vous souhaitez utiliser les outils Go, vous devez suivre les conventions. Si vous voulez aller au travail, vous devez l'importer avec le nom complet, sinon mettez-le où vous voulez dans GOPATH

Vous devez donc utiliser le chemin d’importation complet github.com/levin/foo si vous souhaitez que go get fonctionne, et procédez ainsi si vous souhaitez que d’autres personnes utilisent votre package.

La réponse à votre deuxième question:

Cela ne causerait-il pas beaucoup de travail si je transfère mes codes vers Bitbucket ou si j'héberge mon propre serveur git dans AWS? 

Il existe un moyen d’utiliser un nom de domaine personnalisé comme chemin d’importation tout en hébergeant votre code où vous le souhaitez, il s’agit d’un chemin d’importation vanity je pense. Il vous suffit d’ajouter des balises META au fichier HTML qui est servi dans le fichier d’importation que vous utilisez.

This article explique comment procéder, mais en résumé, dans le fichier qui est servi dans votre domaine personnalisé lors de l'accès au chemin d'importation personnalisé, vous devez ajouter une balise méta go-import qui pointe vers l'endroit où vous avez hébergé. le code. L'article utilise github.com/foo/bar comme exemple de l'endroit où vous hébergez votre code et foo.com/bar comme véritable chemin d'importation.

Donc, dans le fichier qui est servi en accédant à foo.com/bar, il devrait y avoir une balise META comme celle-ci:

<meta name="go-import" content="golang.org/x/tools git http://github.com/foo/bar">

Et vous continuez à héberger votre code dans github. Ensuite, si vous modifiez l'emplacement d'hébergement en votre code, vous ne modifiez que la valeur de la balise META, mais tout le code qui utilise le package continue à utiliser exactement le même chemin d'importation "foo.com/bar.

Le seul problème avec cela est que maintenant votre projet peut être importé par 2 chemins différents: foo.com/bar et github.com/foo/bar. Pour résoudre ce problème, ils ont importations canoniques qui autorisent uniquement l'importation du package à l'aide du chemin personnalisé et non de celui de github. Il suffit d'ajouter un commentaire à côté du nom du package sur chaque fichier de package:

package bar // import "foo.com/bar"

C'est le seul moyen d'éviter le problème que vous avez. Vous pouvez utiliser @srxf answer si vous utilisez un paquet qui va juste être utilisé localement, sachez simplement que les outils go ne fonctionneront pas avec ce code (comme go get). Si vous voulez que le code fonctionne comme prévu, c'est la voie à suivre.

En commentaire, je sais que github.com/levin/foo est importun pour un paquet local, mais si vous utilisez ce paquet dans un autre paquet (disons foo2) et que quelqu'un d'autre importe foo2, le compilateur sait exactement où obtenir les dépendances pour foo2, parce que toute l'importation dans le code inclut la route entière, pas le nom d'un fichier local. De cette façon, les utilisateurs peuvent toujours obtenir les dépendances dont ils ont besoin pour votre package sans avoir à inclure ces fichiers dans votre référentiel et sans avoir à configurer quoi que ce soit pour que cela fonctionne. Ce n'est pas parfait, mais c'est comme ça que ça marche, ils appellent ça convention over configuration ou quelque chose comme ça.

8
Topo

Nous développons également un projet (privé) et nous l’hébergeons sur GitLab et je suis bien conscient que go get ne fonctionne pas bien sur les référentiels privés (du moins autant que je sache).

Ce que nous avons fait est de créer un dossier, disons $GOPATH/src/theproject et de cloner tous les référentiels qu'il contient. 

Jusqu'ici, cela fonctionne bien pour nous, mais vous pouvez aussi penser que c'est fastidieux de le faire, et c'est bien le cas, mais nous n'avons pas d'autre moyen de le faire. Nous mettons à jour manuellement le code en utilisant git pull.

0
srf