Maison >développement back-end >Golang >Ma première CLI avec Go
Je me suis toujours senti un peu anxieux d'écrire sur mes expériences. Eh bien, je pense que je peux m'en occuper maintenant. C'était un petit matin d'août lorsque j'ai décidé d'écrire un outil CLI juste pour "pratiquer" Go car j'avais appris les bases quelques jours plus tôt. Je ne regarde pas beaucoup de tutoriels de nos jours mais j'ai regardé la vidéo de Nana sur Golang et c'était plutôt génial. Alors, allons-y.
Je voulais expérimenter Go pour apprendre le module os. La première pensée qui m'est venue à l'esprit a été de créer un turborepo avec Golang comme serveur. Oui, je sais qu'on ne peut pas l'héberger à Vercel, mais l'idée était de créer un serveur rapide et sécurisé avec Golang. Nous pouvons utiliser un proxy API dans Vercel pour réécrire les requêtes côté client. Cependant, vous devrez héberger votre serveur Go séparément dans certains endroits comme Railway ou Render. Cela ne suit pas la règle d'une architecture mono-repo, il s'agit simplement de conserver tout le code en un seul endroit et de construire un serveur solide. Il s'appelait turbo-g (turbo + go).
Eh bien, après avoir créé un projet de modèle, j'ai réalisé que Turbo avait quelques problèmes avec le rechargement à chaud et bien d'autres choses. Alors, finalement, j’ai abandonné l’idée et je suis passé à créer autre chose.
Lors de la création de ce projet de modèle, j'ai vu que je devais configurer le serveur manuellement et j'ai utilisé gofiber car il possède des fonctionnalités de type express, et en tant que développeur de pile MERN, je l'ai trouvé très facile à utiliser. Une fois, j'ai pensé créer également un générateur de projet serveur dans Express, mais ils en ont déjà un, il s'appelle express-generator. Ensuite, j’ai pensé qu’il pourrait y avoir la même chose pour la fibre. Mais lorsque j'ai cherché dans GitHub avec le sujet : go-backend-template, je n'ai trouvé que des modèles prédéfinis que vous pouvez cloner et utiliser pour vos projets. C'est à ce moment-là que j'ai décidé de tenter le coup.
Créer une CLI avec go est assez simple, car les codes go sont compilés dans un exécutable binaire. Mais je ne savais pas comment créer des fichiers et des dossiers à l'aide du module os. En JavaScript (NodeJs), nous pouvons utiliser le module fs pour gérer les fichiers. Tout cela merci aux docs de m'avoir aidé. Je savais déjà à quoi ressemble un projet backend de base dans Express et Fibre. Mon approche était très simple. Je vais créer un outil CLI qui utilisera quelques indicateurs comme --init et --name pour le nom du projet et il générera un projet et go.mod avec la fibre comme dépendance.
Ensuite, je suis resté coincé dans ce qu'on appelle les modèles. Les modèles sont le squelette d'un fichier Go. Un modèle contient le contenu du fichier. C'était intéressant d'en apprendre davantage sur les modèles. Ensuite, il était facile de prendre le nom du projet à partir du drapeau et de créer tous les dossiers de fichiers à l'aide de os.MkdirAlland, d'analyser les modèles avec le module texte/modèle et d'obtenir le contenu pour créer les fichiers. Tous les détails de ces modules peuvent être trouvés dans la documentation Golang que j'ai mentionnée ci-dessus. Et puis c'était fait ! ? Mais..
dirs := []string{"cmd", "internal/handlers", "internal/middleware", "internal/models", "internal/routes", "internal/services", "config"} for _, dir := range dirs { if err := os.MkdirAll(filepath.Join(projectPath, dir), os.ModePerm); err != nil { return fmt.Errorf("❗Failed to create directory %s: %w", dir, err) } }
J'ai vite découvert que je n'utilisais pas github.com/
Un autre problème qui existe toujours est que je n'ai fourni aucun code dans le fichier de modèle de middleware et dans le fichier de modèle de configuration. Les utilisateurs peuvent utiliser MongoDB ou PostgreSQL comme base de données, il n'était donc pas nécessaire de fournir une ou les deux configurations dans le modèle. Eh bien, pour résoudre ce problème, j'ai créé un problème et toute personne lisant ce blog peut contribuer à résoudre ce problème. J'ai déjà trouvé un moyen mais cela revient au troisième problème.
La CLI peut accepter une entrée utilisateur appelée -db pour obtenir le choix de l'utilisateur de bases de données comme MongoDB ou PostgreSQL pour établir une connexion factice dans le modèle de configuration. Mais à mesure que le code évolue pour résoudre ce genre de problèmes, la CLI deviendra inutilisable. Il a déjà 2 indicateurs obligatoires et un facultatif qui sont --init, -gh et -name, et si nous ajoutons un indicateur -db, ce sera une commande très longue. Pour résoudre ce problème, je vais modifier la CLI en tant que interactive comme create-next-app. Après ce changement, nous pouvons ajouter de nombreuses options de personnalisation. Je travaille déjà là-dessus. Alors si vous souhaitez contribuer, vous êtes les bienvenus. Vous pouvez trouver le problème ici.
Le dernier problème pour l'instant est un module de rechargement à chaud. Chaque fois que nous créons une application fibre, nous n'avons aucun écouteur de changement par défaut. Si la fibre l'a déjà et que je ne le sais pas, pardonnez-moi, je suis relativement nouveau dans ce domaine. Si vous savez quelque chose à ce sujet, faites-le-moi savoir dans les commentaires. Pour résoudre ce problème, j'ai pensé à inclure air dans le projet.
C'est l'histoire de Optique . Cependant, le blog a pour but de vous faire connaître le petit projet et c'est aussi une invitation à contribuer au projet si vous le souhaitez.
Le voyage vient de commencer et il a été très intéressant jusqu'à présent. J'ai appris beaucoup de choses et je suis prêt à en apprendre davantage à l'avenir. C'était mon premier blog ici, donc si j'ai fait une erreur ou oublié quelque chose, ignorez-le et pardonnez-moi. ce sera mieux la prochaine fois.
Merci à tous d'avoir lu le blog, donnez un ⭐ à Optical si vous le trouvez intéressant. Partagez également si vous connaissez quelqu’un prêt à contribuer. De plus, si vous rencontrez des problèmes ou avez des idées d'amélioration, vous pouvez créer un problème ici
Merci encore.
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!