The rules should be considered experimental. They support:
- libraries
- binaries
- tests
- vendoring
- cgo
They currently do not support (in order of importance):
//+build
tags- auto generated BUILD files.
- C/C++ interoperation except cgo (swig etc.)
- race detector
- coverage
- test sharding
-
Decide on the name of your package, eg.
github.com/joe/project
-
Add the following to your WORKSPACE file:
git_repository( name = "io_bazel_rules_go", remote = "https://github.com/bazelbuild/rules_go.git", tag = "0.0.3", ) load("@io_bazel_rules_go//go:def.bzl", "go_repositories") go_repositories()
-
Add a
BUILD
file to the top of your workspace, declaring the name of your workspace usinggo_prefix
. It is strongly recommended that the prefix is not empty.load("@io_bazel_rules_go//go:def.bzl", "go_prefix") go_prefix("github.com/joe/project")
-
For a library
github.com/joe/project/lib
, createlib/BUILD
, containingload("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["file.go"] )
-
Inside your project, you can use this library by declaring a dependency
go_binary( ... deps = ["//lib:go_default_library"] )
-
In this case, import the library as
github.com/joe/project/lib
. -
For vendored libraries, you may depend on
//lib/vendor/github.com/user/project:go_default_library
. Vendored libraries should have BUILD files like normal libraries. -
To declare a test,
go_test( name = "mytest", srcs = ["file_test.go"], library = ":go_default_library" )
Yes, this setup was deliberately chosen to be compatible with the go
tool. Make sure your workspace appears under
$GOROOT/src/github.com/joe/project/
eg.
mkdir -p $GOROOT/src/github.com/joe/
ln -s my/bazel/workspace $GOROOT/src/github.com/joe/project
and it should work.
These rules are not supported by Google's Go team.
go_prefix(prefix)
Attributes | |
---|---|
prefix |
String, required
Global prefix used to fully qualify all Go targets.
In Go, imports are always fully qualified with a URL, eg.
|
go_library(name, srcs, deps, data)
Attributes | |
---|---|
name |
Name, required
A unique name for this rule. |
srcs |
List of labels, required
List of Go |
deps |
List of labels, optional
List of other libraries to linked to this library target |
data |
List of labels, optional
List of files needed by this rule at runtime. |
cgo_library(name, srcs, copts, clinkopts, cdeps, deps, data)
Attributes | |
---|---|
name |
Name, required
A unique name for this rule. |
srcs |
List of labels, required
List of Go, C and C++ files that are processed to build a Go library. Those Go files must contain |
copts |
List of strings, optional
Add these flags to the C++ compiler |
clinkopts |
List of strings, optional
Add these flags to the C++ linker |
cdeps |
List of labels, optional
List of C/C++ libraries to be linked into the binary target.
They must be |
deps |
List of labels, optional
List of other Go libraries to be linked to this library |
data |
List of labels, optional
List of files needed by this rule at runtime. |
srcs
cannot contain pure-Go files, which do not have import "C"
.
So you need to define another go_library
when you build a go package with
both cgo-enabled and pure-Go sources.
cgo_library(
name = "cgo_enabled",
srcs = ["cgo-enabled.go", "foo.cc", "bar.S", "baz.a"],
)
go_library(
name = "go_default_library",
srcs = ["pure-go.go"],
library = ":cgo_enabled",
)
go_binary(name, srcs, deps, data)
Attributes | |
---|---|
name |
Name, required
A unique name for this rule. |
srcs |
List of labels, required
List of Go |
deps |
List of labels, optional
List of other Go libraries to linked to this binary target |
data |
List of labels, optional
List of files needed by this rule at runtime. |
go_test(name, srcs, deps, data)
Attributes | |
---|---|
name |
Name, required
A unique name for this rule. |
srcs |
List of labels, required
List of Go |
deps |
List of labels, optional
List of other Go libraries to linked to this test target |
data |
List of labels, optional
List of files needed by this rule at runtime. |