Dans nodejs, j'utilise __dirname . Quel est l'équivalent de cela à Golang?
J'ai googlé et découvert cet article http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Où il utilise le code ci-dessous
_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))
Mais est-ce la bonne façon ou la façon idiomatique de faire à Golang?
0
, non1
, àruntime.Caller()
.runtime.Caller(0)
vous donnera le chemin du fichier source, comme$GOPATH/src/packagename/main.go
. Les autres réponses de ce fil essaient de renvoyer le chemin de l'exécutable (comme$GOPATH/bin/packagename
).Réponses:
Cela devrait le faire:
la source
_, currentFilePath, _, _ := runtime.Caller(0)
dirpath := path.Dir(currentFilePath)
(notez leruntime.Caller(0)
au lieu deruntime.Caller(1)
)EDIT: à partir de Go 1.8 (sortie en février 2017), la méthode recommandée pour ce faire est la suivante
os.Executable
:Pour obtenir uniquement le répertoire de l'exécutable que vous pouvez utiliser
path/filepath.Dir
.Exemple :
ANCIENNE RÉPONSE:
Vous devriez pouvoir utiliser
os.Getwd
Par exemple:
la source
runtime.Caller
c'est le plus proche que vous obtiendrez "idiomatique"path/filepath.Dir
carpath.Dir
ne fonctionne qu'avec des barres obliques (style Unix) comme séparateurs de répertoires.Utiliser le package osext
Il fournit une fonction
ExecutableFolder()
qui renvoie un chemin absolu vers le dossier où réside l'exécutable du programme en cours d'exécution (utile pour les tâches cron). C'est multiplateforme.Documentation en ligne
la source
go run main.go
pour le développement local. Je ne sais pas comment mieux contourner cela sans construire un exécutable au préalable à chaque fois.go run
. Ces fichiers binaires sont placés à chaque fois dans un dossier temporaire.go install
, puis de courirgo build -v *.go && ./main
. Le-v
vous dirait quels fichiers sont en cours de construction. En général, j'ai trouvé que le temps est différent entrego run
etgo build
est tolérable si j'ai déjà courugo install
. Pour les utilisateurs de Windows sur PowerShell, la commande serago build -v {*}.go && ./main.exe
$GOPATH/bin/
, pourquoi ne pas utiliser$GOPATH/bin/
?Comme indiqué dans le commentaire, cela renvoie le répertoire actuellement actif.
la source
si vous utilisez cette méthode:
vous obtiendrez le chemin / tmp lorsque vous exécutez un programme en utilisant un IDE comme GoLang parce que l'exécutable sera enregistré et exécuté à partir de / tmp
Je pense que la meilleure façon d'obtenir le répertoire de travail actuel ou '.' est :
la fonction os.Getwd () renverra le répertoire de travail actuel. et tout cela sans utiliser de bibliothèque externe: D
la source
Si vous utilisez le package osext par kardianos et que vous devez tester localement, comme l'a commenté Derek Dowling:
La solution est de créer un utilitaire gorun.exe au lieu d'utiliser go run. L'utilitaire gorun.exe compilerait le projet en utilisant «go build», puis l'exécuterait juste après, dans le répertoire normal de votre projet.
J'ai eu ce problème avec d'autres compilateurs et je me suis retrouvé à faire ces utilitaires car ils ne sont pas fournis avec le compilateur ... c'est particulièrement mystérieux avec des outils comme C où vous devez compiler et lier puis l'exécuter (trop de travail).
Si quelqu'un aime mon idée de gorun.exe (ou elf), je le téléchargerai probablement sur github bientôt ..
Désolé, cette réponse se veut un commentaire, mais je ne peux pas faire de commentaire car je n'ai pas encore une réputation assez grande.
Alternativement, "go run" pourrait être modifié (s'il n'a pas déjà cette fonctionnalité) pour avoir un paramètre tel que "go run -notemp" pour ne pas exécuter le programme dans un répertoire temporaire (ou quelque chose de similaire). Mais je préférerais simplement taper gorun ou "gor" car il est plus court qu'un paramètre alambiqué. Gorun.exe ou gor.exe devraient être installés dans le même répertoire que votre compilateur go
Implémenter gorun.exe (ou gor.exe) serait trivial, comme je l'ai fait avec d'autres compilateurs en seulement quelques lignes de code ... (derniers mots célèbres ;-)
la source
_, callerFile, _, _ := runtime.Caller(0)
executablePath := filepath.Dir(callerFile)
placeos.Executable
: https://tip.golang.org/pkg/os/#Executablefilepath.EvalSymlinks
: https://golang.org/pkg/path/filepath/#EvalSymlinksDémo complète:
la source
Parfois, cela suffit, le premier argument sera toujours le chemin du fichier
la source
La réponse de Gustavo Niemeyer est excellente. Mais dans Windows, le proc d'exécution est principalement dans un autre répertoire, comme ceci:
Si vous utilisez un chemin de fichier relatif, comme
"/config/api.yaml"
, cela utilisera le chemin de votre projet là où votre code existe.la source