web-dev-qa-db-fra.com

Golang: lance tous les fichiers .go du répertoire courant via la ligne de commande (package de fichiers multiples)

Je suis un nouveau venu à aller. J'aime beaucoup le langage, mais je me suis vite rendu compte que je devais commencer à diviser mes fichiers en raison de l’augmentation de la taille du programme. 

go run main.go (avec main.go ayant été le fichier avec ma fonction main ())

cela ne fonctionnait pas et je me suis heurté à une barrière pendant un moment, parce que je ne savais pas comment faire fonctionner mon programme. 

Quelques recherches rapides me conduisent à la réponse de

go run main.go other.go .. 

où en tapant tous les fichiers qui composent mon package main, je pourrais faire fonctionner la programmation. Cependant, cette tâche est extrêmement lourde et frustrante à chaque fois.

J'écris la question suivante à réponse spontanée afin d'empêcher d'autres personnes comme moi-même de se heurter à nouveau à cette barrière.

42
dk123

As Nate Finch notes:

Go run est ... vraiment destiné à être utilisé sur de très petits programmes, qui ne nécessitent généralement qu'un seul fichier.

Même sous unix, go run *.go est souvent incorrect. Dans tout projet avec des tests unitaires (et chaque projet doit avoir des tests unitaires), ceci donnera l'erreur:

go run: cannot run *_test.go files (something_test.go)

Il ignorera également les restrictions de construction, de sorte que les fichiers _windows.go seront compilés (ou tenteront de l'être) sous Unix, ce qui n'est pas ce que vous voulez.

Il y a eu un peu de discussions pour faire en sorte que go run fonctionne comme le reste des commandes go, et il existe un CL ouvert pour cela ( 5164 ). C'est actuellement à l'étude pour Go 1.4. En attendant, la solution recommandée sur toutes les plateformes est la suivante:

go build && ./<executable>
60
Rob Napier

Systèmes liés à Unix

go run *.go sera suffisant dans la plupart des cas. 

Continuez à la méthode ci-dessous si cela provoque des erreurs.

Systèmes Windows (et dans d'autres cas où go run *.go ne fonctionne pas)

L’expansion des jetons ne fonctionne pas dans la ligne de commande de Windows et par conséquent, ce qui précède ne fonctionnera pas et n’affichera pas d’erreur. go run *.go peut également ne pas fonctionner dans les systèmes d'exploitation dans certains cas en raison des limites actuelles du compilateur.

Dans ces cas, utilisez

go build && foo.exe

foo.exe est le nom du fichier .exe produit . Si vous n'avez peut-être aucune idée du nom de votre exécutable, commencez par

go build et vérifiez le nom du fichier .exe produit. Ensuite, utilisez la méthode qui inclut le nom du fichier.

Ces 2 méthodes vont construire et exécuter tous les fichiers .go de votre répertoire actuel avec un minimum de tracas.

20
dk123

La meilleure façon de le faire est de l'exécuter comme ceci:

go run !(*_test).go

Il ignore tous vos fichiers de test, ce qui est exactement ce dont vous avez besoin pour éviter l'erreur.

L'autre suggestion:

go build && ./<executable>

est un peu ennuyeux. Vous devez supprimer l'exécutable tout le temps pour éviter d'être marqué par git. Vous pouvez le mettre dans gitignore, bien sûr, mais je suis paresseux et ceci est une étape supplémentaire.

14
r.sendecky

Vous pouvez exécuter tous les fichiers .go, à l'exception des tests, en utilisant cette construction bash:

go run $(ls -1 *.go | grep -v _test.go)
14
Ruben S

Si je comprends bien votre question, vous devez importer un autre code en tant que bibliothèques. 

Petit exemple

./testing/main.go:

package main

import "fmt"
import L "testing/lib"

func main() {
    fmt.Println("Hello from main()")
    L.Somefunc()
}

./testing/lib/somelib.go:

package lib

import "fmt"

func Somefunc() {
    fmt.Println("Hello from Somefunc()")
    return
}

Pour lancer - go run main.go

4
Noisee

juste utiliser ceci

go run *.go 

cela fonctionnera en supposant que vous n'avez pas de fichiers de test

2
Vinay Mahamuni

Voici ma solution:

go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)

Je l'utilise avec un alias pour faciliter l'exécution d'applications en ligne de commande

alias gorun='go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)'

$ gorun param1 param2
2
Clément Prévost

Sur Windows, j’ai d’habitude ajouté un peu test.bat à tous les répertoires de mon projet:

go build
.\{project_name}.exe
go clean

Fonctionne assez bien. Remplacez {nom_projet} par le nom de votre exécutable, bien entendu. Et une fois l'exécutable terminé, le script de traitement par lots passe au nettoyage.

1
Unknown Variable

Pour window, les travaux suivants: Ouvrez cmd et accédez au chemin où se trouve votre dossier. Puis tapez la commande suivante et appuyez sur Entrée.

go build

après celui-ci sera créé un exécutable. Dans la commande Invite, appelez l'exécutable . Si votre nom d'exécutable est Project.exe, tapez ce qui suit et appuyez sur Entrée:

Project.exe
0
M. Paul

Pour les personnes essayant d'utiliser go run combiné avec go generate, une solution peut être:

//go:generate sh -c "go run path/*.go"
0
Rémi Rousselet

Enfin, nous pouvons maintenant utiliser:

go run .

grâce à: https://github.com/golang/go/issues/22726#issuecomment-345841019

0
Macilias