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.
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>
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
où 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.
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.
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)
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
il suffit d'utiliser cette
go run *.go
il travaillera en supposant que u n'ont pas de fichiers de test
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.
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
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"