Go rules -------- The files here demonstrate how to use the supplied rules for Go. They do support: * libraries * binaries * tests They currently do not support: * coverage * race detector * multiple target configurations * //+build tags * C/C++ interoperation (cgo, swig etc.) Testing ------- Setup a symlink to the Go installation you wish to use, ln -s /usr/lib/golang/ tools/go/go_root or ln -s $(go env GOROOT) tools/go/go_root To build something, run bazel build examples/go/... To run a test, run bazel test --test_arg=--test.v examples/go/lib1:lib1_test Writing BUILD rules ------------------- In the bazel model of compiling Go, each directory can hold multiple packages, rather than just one in the standard "go" tool. Suppose you have dir/f.go: package p func F() {} then in the BUILD file could say go_library( name = "q", srcs = ["f.go"]) and you import it with its Bazel name, import "dir/p/q" this add the declared package name as namespace, i.e., it is equivalent to import p "dir/p/q" so you use it as follows import "dir/p/q" main() { p.F() } FAQ --- # Why does this not follow the external Go conventions? These rules were inspired on Google's internal Go rules, which work like this. They make more sense for Bazel, because directories in Bazel do not correspond to single rules. # Do I have to specify dependencies twice? Yes, once in the BUILD file, once in the source file. Bazel does not examine file contents, so it cannot infer the dependencies. It is possible to generate the BUILD file from the Go sources through a separate program, though. Disclaimer ---------- These rules are not supported by Google's Go team.