Comment importer des packages locaux sans gopath
J'ai utilisé GOPATH
mais pour cette question, je suis en face ça n'aide pas. Je veux être en mesure de créer des packages qui sont spécifiques à un projet:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
J'ai essayé de plusieurs façons, mais comment puis-je obtenir package1.go
de travailler dans le binary1.go
ou la binary2.go
et ainsi de suite?
Par exemple; je veux être en mesure de import "package1"
et ensuite être en mesure d'exécuter go build binary1.go
et tout fonctionne bien sans l'erreur de lancer le package ne peut pas être trouvé sur GOROOT
ou GOPATH
. La raison pour laquelle j'ai besoin de ce type de fonctionnalité est pour les grands projets; je ne veux pas avoir à faire référence à plusieurs autres paquets ou les garder dans un fichier de grande taille.
- Vous êtes censé mettre les fichiers source pour chaque binaire dans son propre répertoire.
- Tous les
.go
fichiers dans un seul répertoire font partie d'un même ensemble, et vous n'avez pas besoin deimport
fichiers dans le même package (c'est à dire, le même répertoire). Vous avez mentionné travaillant à l'extérieur de GOPATH, qui est l'une des capacités de la nouvelle Passer les modules du système. Cette répondre couvre la structure du module, l'importation de packages locaux, organiser des paquets au sein d'un module, ou de ne pas avoir plusieurs modules dans un seul dépôt, etc. - Et ce comportement est ok avec tout le monde? Que, fondamentalement, vous ne pouvez pas importer votre local sous-paquets, sauf si vous spécifiez l'ensemble de la
git/repo/to/my/project
chemin? Je ne vois pas la raison pourquoi quelqu'un voudrait de ce comportement. Si vous déplacez votre projet à un autre endroit (c'est à dire le Panneau de l'image), vous devrez modifier tous les chemins de nouveau? Je suis à la recherche de réponses à la question pourquoi c'est si compliqué.
Vous devez vous connecter pour publier un commentaire.
Aller de gestion de la dépendance résumé:
vgo
si votre version est:x >= go 1.11
dep
ouvendor
si votre version est:go 1.6 >= x < go 1.11
x < go 1.6
Edit 3: Aller 1.11 a une fonction
vgo
qui remplacerdep
.À utiliser
vgo
, voir Les Modules de de la documentation. TLDR ci-dessous:Cette méthode crée un fichier appelé
go.mod
dans votre répertoire de projets. Vous pouvez alors construire votre projet avecgo build
. SiGO111MODULE=auto
est défini, votre projet ne peut pas être dans$GOPATH
.Edit 2: Le vendoring méthode est toujours valide et fonctionne sans problème.
vendor
est en grande partie un processus manuel, à cause de cettedep
etvgo
ont été créés.Edit 1: Alors que mon ancienne méthode fonctionne, il n'est pas plus la "bonne" façon de le faire. Vous devriez être en utilisant vendeur capacités,
vgo
, oudep
(pour l'instant) qui sont activées par défaut dans Go 1.6; voir. En gros, vous ajoutez votre "externe" ou "dépendant" des paquets au sein d'unvendor
répertoire; lors de la compilation, le compilateur d'utiliser ces paquets en premier.Trouvé. J'ai pu importer forfait local
GOPATH
par la création d'un sous-dossier depackage1
, puis de l'importer avecimport "./package1"
dansbinary1.go
etbinary2.go
scripts comme ceci :binary1.aller
Donc mon répertoire courant de la structure ressemble à ceci:
Je tiens également à noter que les chemins relatifs (au moins en aller 1.5) aussi travail; par exemple:
import "../package1"
vgo
remplacement de dep ? github.com/golang/go/wiki/vgo#current-statedep
ne fera pas partie de l'ensemble des outils, maisvgo
sera, comme on peut le lire sur l'aller [github.com/golang/go/wiki/... de la page). Il est annoncé pour aller v1.11, qui est prévue en Août. 2018.Il n'y a pas une telle chose comme "forfait local". L'organisation des paquets sur un disque est orthogonale à toutes les relations parent/enfant de paquets. La seule vraie hiérarchie formée par paquets est l'arbre des dépendances, qui dans le cas général ne reflète pas l'arborescence des répertoires.
Suffit d'utiliser
et ne pas lutter contre le système de construction pour aucune bonne raison. Enregistrement d'une douzaine de caractères par importer dans n'importe quel non trivial programme n'est pas une bonne raison, parce que, par exemple, des projets relatifs à l'importation chemins ne sont pas aller inoubliables.
Le concept de l'importation chemins ont des propriétés importantes:
Tous les ci-dessus est ruiné par l'aide relative à l'importation des chemins. Ne pas le faire.
PS: Il y a peu d'endroits dans le code héritage en Aller compilateur tests qui utilisent relative des importations. ATM, c'est la seule raison pourquoi relative des importations sont pris en charge à tous.
import "myproject/packageN"
.myproject
est le nom du dossier qui contient mon projet?Peut-être que vous essayez de modulariser votre colis. Je suis en supposant que
package1
etpackage2
sont, dans un sens, partie du même package, mais pour des raisons de lisibilité, vous êtes fractionnement ceux en plusieurs fichiers.Si le cas précédent a été le vôtre, vous pouvez utiliser le même nom de package dans ces multiples fichiers et il sera comme si il y avait le même fichier.
Ceci est un exemple:
ajouter.aller
soustraire.aller
ne rien faire.aller
Je ne suis pas une Aller de l'expert et ceci est mon premier post dans StackOveflow, donc si vous avez quelques conseils, il sera bien reçu.
J'ai un problème similaire et la solution, je suis actuellement en utilisant les utilisations Aller 1.11 modules. J'ai la structure suivante
Et je suis en mesure d'importer package1 et package2 de projet1 et projet2 en utilisant
Après l'exécution de
go mod init projects
. Je peux utilisergo build
de projet1 et projet2 répertoires ou je peux fairego build -o project1/exe project1/*.go
à partir du répertoire de projets.L'inconvénient de cette méthode est que tous vos projets finissent par le partage de la même liste de dépendances en aller.mod. Je suis toujours à la recherche d'une solution à ce problème, mais il semble que cela pourrait être fondamental.
Pour ajouter un "local", l'ensemble à votre projet, ajouter un dossier (par exemple "nom_du_package"). Et de mettre en œuvre les fichiers dans ce dossier.
Dans votre
package main
ce faire:Où
package_name
est le nom du dossier et qu'il doit correspondre au nom de paquet utilisé dans les fichiers whatever_name1.aller et whatever_name2.aller. En d'autres termes, tous les fichiers avec un sous-répertoire doit être le même paquet.Vous pouvez imbriquer plusieurs sous-répertoires aussi longtemps que vous spécifiez le chemin d'accès complet vers le dossier parent dans l'importation.