Problèmes d'autorisation avec Go et Makefile : une plongée plus approfondie
Les erreurs d'autorisation refusée peuvent être déroutantes, surtout lorsqu'elles proviennent de commandes apparemment simples. Dans ce cas, l'écart entre running go run . directement et via un Makefile a soulevé des questions.
Racine du problème
Le problème provient d'un bug dans GNU make. Si un répertoire nommé go existe dans n'importe quel répertoire de votre PATH, gnulib le considère comme un répertoire. Par conséquent, lorsque Makefile tente d'exécuter go run ., il recherche incorrectement un répertoire et rencontre des erreurs d'autorisation refusée.
Vérification
Pour confirmer ce problème, vérifiez votre PATH pour tous les répertoires contenant un sous-répertoire go. Si un tel répertoire existe, c'est probablement le coupable.
Solution de contournement
Si vous ne parvenez pas à supprimer le répertoire problématique de votre PATH ou à le renommer, vous pouvez contourner le bug en s'assurant que Makefile invoque un shell avant d'exécuter go run .. L'ajout d'un point-virgule à la fin de la commande forcera Makefile à utiliser un shell.
run: go run . ;
Approche alternative : run2
La raison pour laquelle run2 fonctionne est qu'il définit explicitement une commande shell. En enveloppant le go run . commande dans echo "Make say hello" ;, Makefile est obligé d'exécuter la commande dans un shell, résolvant le problème d'autorisation.
Débogage avec -d et --trace
L'utilisation de -d ou --trace avec Makefile fournit des informations supplémentaires sur le problème. En examinant le résultat, vous pouvez vérifier l'existence du répertoire go problématique et l'absence de shell invoqué.
Conclusion
Ce problème résulte d'un bug spécifique dans GNU make. En comprenant la cause et en appliquant la solution de contournement appropriée, vous pouvez résoudre ce problème et assurer la réussite de l'exécution de vos programmes Go via Makefile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!