Golang: exécution de tous.aller des fichiers dans le répertoire courant par la ligne de commande (multi file package)

je suis un nouveau venu à l'Aller. J'aime énormément la langue, mais je me suis vite rendu compte que je devais commencer à diviser mes fichiers en raison d'une augmentation de la taille du programme.

go run main.go (avec le principal.aller avoir été le fichier avec ma fonction main ())

n'a pas fonctionné et j'ai heurté une barrière pendant un certain temps, parce que je n'avais aucune idée 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 les fichiers que ma package main se compose de, je pourrais obtenir la programmation en cours. Cependant, c'est tout à fait encombrant et frustrant à faire à chaque fois.

j'écris la question qui suit afin d'éviter que d'autres personnes comme moi ne se retrouvent dans cette situation.

37
demandé sur dk123 2014-05-16 16:52:14

9 réponses

Nate Finch notes:

Aller courir est ... vraiment seulement destiné à être utilisé sur les très petits programmes, qui ont généralement besoin d'un seul fichier.

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

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

il ignorera aussi les restrictions de construction, donc _windows.go les fichiers seront compilés (ou tentés d'être compilés) sur Unix, ce qui n'est pas ce que vous voulez.

Il y a eu un peu de discussion faire go run travail comme le reste de l' go commandes, et il y a un open CL (5164). Il est actuellement à l'étude pour Aller 1.4. En attendant, la solution recommandée sur toutes les plateformes est:

go build && ./<executable>
56
répondu Rob Napier 2014-05-16 13:03:51

Unix systèmes connexes

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

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

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

L'extension Token ne fonctionne pas dans la ligne de commande windows et par conséquent, ce qui précède ne fonctionnera pas et affichera une erreur. go run *.go peut aussi ne pas fonctionner dans OSs dans certains cas en raison de compilateur courant limitation.

dans ces cas, utilisez

go build && foo.exe

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

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

ces 2 méthodes construiront et exécuteront tous les.allez les fichiers dans votre répertoire courant avec le minimum d'agitation.

19
répondu dk123 2016-05-07 03:28:40

La meilleure façon de le faire est de le lancer comme ceci:

go run !(*_test).go

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

La suggestion de l'autre:

go build && ./<executable>

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

13
répondu r.sendecky 2018-06-08 05:27:22

Vous pouvez exécuter tous .go fichiers, à l'exclusion des tests à l'aide de cette bash construction:

go run $(ls -1 *.go | grep -v _test.go)
12
répondu Ruben S 2017-07-13 13:22:20

si je comprends bien votre question, vous devez importer d'autres codes comme bibliothèques.

Petit exemple

./testing / main.aller:

package main

import "fmt"
import L "testing/lib"

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

./tests/lib/somelib.aller:

package lib

import "fmt"

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

Pour lancer - go run main.go

3
répondu Noisee 2014-05-16 13:03:33

il suffit d'utiliser cette

go run *.go 

il travaillera en supposant que u n'ont pas de fichiers de test

2
répondu Vinay Mahamuni 2017-11-13 06:05:29

sur Windows j'ajoute habituellement juste un peu de test.chauve-souris pour tous mes répertoires de projet:

go build
.\{project_name}.exe
go clean

Fonctionne assez bien. Remplacer {project_name} avec le nom de votre exécutable, bien sûr. Une fois l'exécutable terminé, le script passe au nettoyage.

1
répondu Unknown Variable 2017-11-04 04:13:07

Voici ma solution:

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

Je l'utilise avec un alias pour le rendre facile d'exécuter des applications en ligne de commande

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

$ gorun param1 param2
1
répondu Clément Prévost 2017-11-19 13:20:53

Pour les peuples de la tentative d'utiliser go run combinés avec go generate une solution peut être :

//go:generate sh -c "go run path/*.go"
0
répondu Rémi Rousselet 2018-07-26 07:49:48