Maison >développement back-end >Golang >Programme Hello World simple utilisant le langage Bazel et Go
Après avoir écrit l'article sur "Construire avec Go dans un monorepo en utilisant Bazel, Gazelle et bzlmod" et l'avoir partagé avec certains collègues, j'ai constaté un intérêt croissant pour le développement de monorepo. J’ai appris que peu de gens étaient encore suffisamment expérimentés pour comprendre les avantages que cela pouvait apporter. J'ai donc décidé de convertir ceci en une série commençant par cet article sur le programme Simple hello world utilisant Bazel et Go lang
Dans cet article, je vais essayer de couvrir quelques concepts extrêmement basiques de Bazel ainsi que des extraits de code pour permettre à quelqu'un de se lancer en un rien de temps.
Selon la documentation officielle
Bazel est un outil de construction et de test open source similaire à Make, Maven et Gradle. Il utilise un langage de construction de haut niveau lisible par l’homme. Bazel prend en charge des projets dans plusieurs langues et crée des sorties pour plusieurs plates-formes. Bazel prend en charge de grandes bases de code sur plusieurs référentiels et un grand nombre d'utilisateurs.
Il est utilisé chez Google depuis des décennies et a été minutieusement testé. Vous pouvez en savoir plus sur la façon dont j'en ai pris conscience dans le message lié ci-dessus.
Pour les besoins de cette série, j'ai créé un référentiel sur github.com/nixclix/basil qui évoluera au fil du temps. Au moment de la rédaction de cet article, le dernier commit est https://github.com/nixclix/basil/tree/d8af2aea6fb8b692f735f9959429df9fcd28422b
Alors, allez-y et créez un nouveau dépôt git sur le fournisseur que vous souhaitez choisir
Pour le .gitignore, je recommande fortement d'ajouter ce qui suit afin de ne pas inclure de fichiers inutiles dans vos commits
# If you prefer the allow list template instead of the deny list, see community template: # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore # bazel-* /.ijwb /.clwb /.idea /.project *.swp /.bazelrc.user # macOS-specific excludes .DS_Store # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Dependency directories (remove the comment below to include it) # vendor/ # Go workspace file go.work go.work.sum # env file .env
À partir de Bazel 6.3, vous n'avez plus besoin d'avoir un fichier WORKSPACE. Nous allons donc commencer par créer ce qui suit à la racine du dépôt
MODULE.bazel
"""Building go applications in a monorepo environment""" module(name = "basil", version = "0.0.0") http_file = use_repo_rule( "@bazel_tools//tools/build_defs/repo:http.bzl", "http_file" ) http_archive = use_repo_rule( "@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive" ) # https://github.com/bazelbuild/rules_go/blob/master/docs/go/core/bzlmod.md bazel_dep(name = "rules_go", version = "0.50.1") bazel_dep(name = "gazelle", version = "0.39.1") GO_VERSION = "1.23.2" go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") go_sdk.download(version = GO_VERSION) go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//:go.mod")
C'est ici que nous définissons la version go que nous souhaitons utiliser ainsi que les versions gazelle et Rules_go.
Nous utiliserons Gazelle pour la gestion des fichiers BUILD. Gazelle rend la génération d'un fichier de construction très pratique. Vous pouvez en savoir plus ici
CONSTRUIRE.bazel
load("@gazelle//:def.bzl", "gazelle") gazelle(name = "gazelle") gazelle( name = "gazelle-update-repos", args = [ "-from_file=go.mod", "-to_macro=deps.bzl%go_dependencies", "-prune", ], command = "update-repos", )
Cela devrait être à la racine du dépôt. Cela indique à Gazelle la source du fichier go mod et les autres processus à exécuter
Ensuite, nous créons 3 autres fichiers avec le contenu respectif. Ne vous inquiétez pas de ce qu'ils font pour l'instant.
.bazelignore
runfiles/ bzlmod/
.bazelrc
# Enable Bzlmod for every Bazel command common --enable_bzlmod
version .bazel
# If you prefer the allow list template instead of the deny list, see community template: # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore # bazel-* /.ijwb /.clwb /.idea /.project *.swp /.bazelrc.user # macOS-specific excludes .DS_Store # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Dependency directories (remove the comment below to include it) # vendor/ # Go workspace file go.work go.work.sum # env file .env
Très bien, à ce stade, vous devriez avoir tout ce dont vous avez besoin pour faire fonctionner certaines bases. Maintenant, si vous exécutez bazel build //... à la racine, bazel devrait pouvoir parcourir le référentiel et créer tous les packages qu'il découvre. Bazel met en cache les sorties des packages des versions précédentes, donc toute version ultérieure à partir de maintenant devrait être extrêmement rapide.
Pour l'organisation de base du code, nous écrirons tout le code Go dans un répertoire appelé /packages. De cette façon, toutes les références dans d'autres parties du code peuvent y faire référence comme //packages/...
Créons un répertoire dans le répertoire des packages appelé helloworld et ajoutons ce qui suit
helloworld.go
"""Building go applications in a monorepo environment""" module(name = "basil", version = "0.0.0") http_file = use_repo_rule( "@bazel_tools//tools/build_defs/repo:http.bzl", "http_file" ) http_archive = use_repo_rule( "@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive" ) # https://github.com/bazelbuild/rules_go/blob/master/docs/go/core/bzlmod.md bazel_dep(name = "rules_go", version = "0.50.1") bazel_dep(name = "gazelle", version = "0.39.1") GO_VERSION = "1.23.2" go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") go_sdk.download(version = GO_VERSION) go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//:go.mod")
CONSTRUIRE.bazel
load("@gazelle//:def.bzl", "gazelle") gazelle(name = "gazelle") gazelle( name = "gazelle-update-repos", args = [ "-from_file=go.mod", "-to_macro=deps.bzl%go_dependencies", "-prune", ], command = "update-repos", )
Le programme go est assez simple. Nous avons une fonction principale simple qui imprime simplement un message bonjour tout le monde.
Le bit qui nous intéresse est le fichier BUILD.bazel. Examinons cela bloc par bloc et essayons de comprendre ce que cela signifie.
La première ligne charge les macros go_binary et go_library depuis Rules_go . Vous les trouverez utilisés plus tard dans le code.
À la ligne 10, nous définissons une bibliothèque appelée helloworld_lib et spécifions les sources de la bibliothèque comme helloworld.go. Si ce package doit être rendu importable, vous pouvez également spécifier le chemin sur lequel il sera disponible, qui est basil/packages/helloworld_lib. Vient ensuite la visibilité et nous précisons ici que la bibliothèque est privée uniquement visible au sein de ce package. Dans les prochains articles, nous verrons peut-être comment modifier ces paramètres pour utiliser les dépendances d'autres packages.
À la ligne 3, nous utilisons ensuite la macro go_binary de Rules_go pour générer un binaire pour notre programme. Ici, nous spécifions la bibliothèque que nous avons définie précédemment dans le paramètre embed. La visibilité du package s'applique également aux binaires.
Et c'est tout. Voilà ! Vous pouvez exécuter le binaire en le construisant d'abord en utilisant bazel build //packages/helloworld suivi de bazel run //packages/helloworld
Si vous aimez cet article et souhaitez recevoir de futurs articles qui s'appuient sur celui-ci dans le cadre de la série, veuillez vous abonner et partager cet article.
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!