J'ai utilisé GOPATH
mais pour ce problème actuel auquel je suis confronté, cela n'aide pas. Je souhaite pouvoir créer des packages spécifiques à un projet:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
J'ai essayé plusieurs méthodes, mais comment puis-je package1.go
travailler dans le binary1.go
ou le binary2.go
et ainsi de suite?
Par exemple; Je veux pouvoir import "package1"
, puis être en mesure de fonctionner go build binary1.go
et tout fonctionne bien sans que l'erreur soit générée que 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 projets à grande échelle; Je ne veux pas avoir à référencer plusieurs autres packages ou à les conserver dans un seul gros fichier.
.go
fichiers d'un même répertoire font partie du même package et vous n'avez pas besoin deimport
fichiers dans le même package (c'est-à-dire le même répertoire). Vous avez mentionné travailler en dehors de GOPATH, qui est l'une des capacités du nouveau système de modules Go. Cette réponse couvre la structure du module, l'importation de packages locaux, l'organisation des packages dans un module, le fait d'avoir ou non plusieurs modules dans un seul référentiel, etc.git/repo/to/my/project
chemin complet ? Je ne vois tout simplement pas la raison pour laquelle quiconque voudrait ce comportement. Que faire si vous déplacez votre projet vers un autre emplacement (image Docker par exemple), vous devez à nouveau modifier tous les chemins? Je cherche des réponses sur les raisons pour lesquelles c'est si compliqué.Réponses:
Go résumé de la gestion des dépendances:
vgo
si votre version go est:x >= go 1.11
dep
ouvendor
si votre version go est:go 1.6 >= x < go 1.11
x < go 1.6
Edit 3: Go 1.11 a une fonctionnalité
vgo
qui remplaceradep
.Pour l'utiliser
vgo
, consultez la documentation des modules . TLDR ci-dessous:Cette méthode crée un fichier appelé
go.mod
dans votre répertoire de projets. Vous pouvez ensuite créer votre projet avecgo build
. SiGO111MODULE=auto
est défini, votre projet ne peut pas être au format$GOPATH
.Edit 2: La méthode de vente est toujours valide et fonctionne sans problème.
vendor
est en grande partie un processus manuel, à cause de celadep
etvgo
ont été créés.Edit 1: Bien que mon ancienne méthode fonctionne, ce n'est plus la manière «correcte» de le faire. Vous devez utiliser les fonctionnalités du fournisseur
vgo
, oudep
(pour l'instant) qui sont activées par défaut dans Go 1.6; voir . Vous ajoutez essentiellement vos packages "externes" ou "dépendants" dans unvendor
répertoire; lors de la compilation, le compilateur utilisera ces packages en premier.A trouvé. J'ai pu importer un package local avec
GOPATH
en créant un sous-dossier depackage1
puis en important avecimport "./package1"
inbinary1.go
et desbinary2.go
scripts comme celui-ci:binary1.go
Donc, ma structure de répertoires actuelle ressemble à ceci:
Je dois également noter que les chemins relatifs (au moins dans go 1.5) fonctionnent également; par exemple:
la source
import "../package1"
Il n'existe pas de "paquet local". L'organisation des packages sur un disque est orthogonale à toute relation parent / enfant des packages. La seule véritable hiérarchie formée par les packages est l'arborescence des dépendances, qui dans le cas général ne reflète pas l'arborescence des répertoires.
Juste utiliser
et ne combattez pas le système de construction sans raison valable. Enregistrer une douzaine de caractères par importation dans un programme non trivial n'est pas une bonne raison, car, par exemple, les projets avec des chemins d'importation relatifs ne sont pas accessibles.
Le concept des chemins d'importation a des propriétés importantes:
Tout ce qui précède est ruiné en utilisant des chemins d'importation relatifs. Ne fais pas ça.
PS: Il y a peu d'endroits dans le code hérité des tests du compilateur Go qui utilisent des importations relatives. ATM, c'est la seule raison pour laquelle les importations relatives sont prises en charge.
la source
import "myproject/packageN"
.myproject
est le nom du dossier qui contient mon projet?Vous essayez peut-être de modulariser votre package. Je suppose que
package1
etpackage2
font, d'une certaine manière, partie du même package, mais pour plus de lisibilité, vous les divisez en plusieurs fichiers.Si le cas précédent était le vôtre, vous pourriez utiliser le même nom de package dans ces multiples fichiers et ce sera comme s'il y avait le même fichier.
Ceci est un exemple:
add.go
soustract.go
donothing.go
Je ne suis pas un expert de Go et c'est mon premier article dans StackOveflow, donc si vous avez des conseils, ils seront bien reçus.
la source
J'ai un problème similaire et la solution que j'utilise actuellement utilise les modules Go 1.11. J'ai la structure suivante
Et je suis capable d'importer package1 et package2 à partir de project1 et project2 en utilisant
Après avoir couru
go mod init projects
. Je peux utiliser lesgo build
répertoires project1 et project2 ou je peux le faire àgo build -o project1/exe project1/*.go
partir du répertoire projets.L'inconvénient de cette méthode est que tous vos projets finissent par partager la même liste de dépendances dans go.mod. Je cherche toujours une solution à ce problème, mais il semble que cela puisse être fondamental.
la source
Depuis l'introduction de go.mod , je pense que la gestion des packages locaux et externes devient plus facile. Utilisation de go.mod , il est également possible d'avoir un projet go en dehors du GOPATH.
Importer le package local:
Créez un dossier demoproject et exécutez la commande suivante pour générer le fichier go.mod
go mod init demoproject
J'ai une structure de projet comme ci-dessous dans le répertoire demoproject .
À des fins de démonstration, insérez le code suivant dans le fichier model.go .
Dans main.go , j'ai importé le modèle Employee en me référant à "demoproject / src / model"
Importer une dépendance externe:
Exécutez simplement la
go get
commande dans le répertoire du projet.Par exemple:
Il doit inclure la dépendance de module dans le fichier go.mod
https://blog.golang.org/using-go-modules
la source
can't load package: package .: no Go files in...
(aller dans le dossier go.mod)Pour ajouter un package "local" à votre projet, ajoutez un dossier (par exemple "package_name"). Et mettez vos fichiers d'implémentation dans ce dossier.
Dans votre
package main
faire ceci:Où
package_name
est le nom du dossier et il doit correspondre au nom du package utilisé dans les fichiers n'importe quel nom1.go et n'importe quel nom2.go. En d'autres termes, tous les fichiers avec un sous-répertoire doivent appartenir au même package.Vous pouvez en outre imbriquer davantage de sous-répertoires tant que vous spécifiez le chemin d'accès complet au dossier parent lors de l'importation.
la source
package myproject/package_name is not in GOROOT (/usr/lib/go-1.14/src/myproject/package_name)
Vous pouvez utiliser
replace
toto / go.mod
toto / main.go
bar / go.mod
bar / fn.go
L'importation d'un paquet local revient à importer un paquet externe
sauf dans le fichier go.mod, vous remplacez ce nom de package externe par un dossier local.
Le chemin d'accès au dossier peut être complet ou relatif "/ chemin / vers / bar" ou "../bar"
https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive https://thewebivore.com/using-replace-in-go-mod-to-point -à-votre-module-local /
la source