How to Import an Existing Go Application into a Bazel Monorepo

Buyung Hardiansyah
2 min readJan 16, 2020

in my previous post, i already post about how to setup new go application into bazel monorepo. you can check my previous post here .

Alright, we’’ll get to the point by setting up the Go application that is already running into the bazel monorepo

1. copy the existing project into the monorepo folder. assuming we will name it `go-existing` and save it in the `packages` folder

2. create BUILD.bazel file in the go application root folder:

load("@bazel_gazelle//:def.bzl", "gazelle")# gazelle:prefix github.com/hardyantz/go-hello-worldgazelle(name = "gazelle")load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")go_binary(
name = "hello-world",
embed = [":go_default_library"],
visibility = ["//visibility:public"],
)

in the BUILD.bazel file. the first line is to call the gazelle library. the second line is the path and import path that will be used for the go application. This will affect the dependent library in the application to be able to call packages in the GO application. third line to define naming in gazelle. the fourth line is to call the bazel library for go rules. and the last line is go_binary, it contain the first attribute is the name of the go application which will be called and bazel will look for it from the name defined in go_binary. the second attribute is to embed or call the go library. the last is the visibility attribute on a rule controls whether the rule can be used by other packages. Rules are always visible to other rules declared in the same package.

3. move or copy go.mod to the root of the monorepo bazel folder.

4. WORKSPACE update

update workspace file by running the command:

$ bazel run //:gazelle --update-repos -from_file=go.mod

You can run the same command in the future to update existing WORKSPACE file in root folder to include new go library from you go.mod

5. update dependency in build file

update BUILD.bazel file by running the command:

$ bazel run //:gazelle

this will create or update all of BUILD.bazel file in your bazel directory based on import package in your source code. so you dont have the effort to create or update BUILD.bazel file in your monorepo, and let gazelle do the hardwork.

6. Build or Run the applications

build go-existing application:

$ bazel run //packages/go-existing:hello-world

if you want to build application into the binary file run this command :

$ bazel build //packages/go-existing:hello-world

bazel will show you where the binary target file is.
in this example and build in mac os X, binary file located in :

bazel-bin/packages/go-existing/darwin_amd64_stripped/hello-world

run binary file :

$ ./bazel-bin/packages/go-existing/darwin_amd64_stripped/hello-world

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Buyung Hardiansyah
Buyung Hardiansyah

Written by Buyung Hardiansyah

Software Developer -- Golang | Python | PHP | Reactjs | Flutter

No responses yet

Write a response