xref: /aosp_15_r20/external/bazelbuild-rules_go/go/dependencies.rst (revision 9bb1b549b6a84214c53be0924760be030e66b93a)
1*9bb1b549SSpandan DasGo workspace rules
2*9bb1b549SSpandan Das==================
3*9bb1b549SSpandan Das
4*9bb1b549SSpandan Das.. Links to other sites and pages
5*9bb1b549SSpandan Das.. _gazelle: tools/gazelle/README.rst
6*9bb1b549SSpandan Das.. _github.com/bazelbuild/bazel-skylib: https://github.com/bazelbuild/bazel-skylib
7*9bb1b549SSpandan Das.. _github.com/gogo/protobuf: https://github.com/gogo/protobuf
8*9bb1b549SSpandan Das.. _github.com/golang/protobuf: https://github.com/golang/protobuf/
9*9bb1b549SSpandan Das.. _github.com/google/protobuf: https://github.com/google/protobuf/
10*9bb1b549SSpandan Das.. _github.com/googleapis/googleapis: https://github.com/googleapis/googleapis
11*9bb1b549SSpandan Das.. _github.com/mwitkow/go-proto-validators: https://github.com/mwitkow/go-proto-validators
12*9bb1b549SSpandan Das.. _golang.org/x/net: https://github.com/golang/net/
13*9bb1b549SSpandan Das.. _golang.org/x/sys: https://github.com/golang/sys/
14*9bb1b549SSpandan Das.. _golang.org/x/text: https://github.com/golang/text/
15*9bb1b549SSpandan Das.. _golang.org/x/tools: https://github.com/golang/tools/
16*9bb1b549SSpandan Das.. _google.golang.org/genproto: https://github.com/google/go-genproto
17*9bb1b549SSpandan Das.. _google.golang.org/grpc: https://github.com/grpc/grpc-go
18*9bb1b549SSpandan Das.. _http_archive: https://github.com/bazelbuild/bazel/blob/master/tools/build_defs/repo/http.bzl
19*9bb1b549SSpandan Das.. _nested workspaces: https://bazel.build/designs/2016/09/19/recursive-ws-parsing.html
20*9bb1b549SSpandan Das.. _nogo: nogo.rst#nogo
21*9bb1b549SSpandan Das.. _normal go logic: https://golang.org/cmd/go/#hdr-Remote_import_paths
22*9bb1b549SSpandan Das.. _repositories.bzl: https://github.com/bazelbuild/rules_go/blob/master/go/private/repositories.bzl
23*9bb1b549SSpandan Das.. _rules_proto: https://github.com/bazelbuild/rules_proto
24*9bb1b549SSpandan Das.. _third_party: https://github.com/bazelbuild/rules_go/tree/master/third_party
25*9bb1b549SSpandan Das.. _toolchains: toolchains.rst
26*9bb1b549SSpandan Das
27*9bb1b549SSpandan Das.. Go rules
28*9bb1b549SSpandan Das.. _go_library: /docs/go/core/rules.md#go_library
29*9bb1b549SSpandan Das.. _go_proto_library: https://github.com/bazelbuild/rules_go/blob/master/proto/core.rst#go-proto-library
30*9bb1b549SSpandan Das.. _go_register_toolchains: toolchains.rst#go_register_toolchains
31*9bb1b549SSpandan Das.. _go_repository: https://github.com/bazelbuild/bazel-gazelle/blob/master/repository.md#go_repository
32*9bb1b549SSpandan Das.. _go_toolchain: toolchains.rst#go_toolchain
33*9bb1b549SSpandan Das
34*9bb1b549SSpandan Das.. Other rules
35*9bb1b549SSpandan Das.. _git_repository: https://github.com/bazelbuild/bazel/blob/master/tools/build_defs/repo/git.bzl
36*9bb1b549SSpandan Das.. _proto_library: https://github.com/bazelbuild/rules_proto
37*9bb1b549SSpandan Das
38*9bb1b549SSpandan Das.. Issues
39*9bb1b549SSpandan Das.. _#1986: https://github.com/bazelbuild/rules_go/issues/1986
40*9bb1b549SSpandan Das
41*9bb1b549SSpandan Das.. role:: param(kbd)
42*9bb1b549SSpandan Das.. role:: type(emphasis)
43*9bb1b549SSpandan Das.. role:: value(code)
44*9bb1b549SSpandan Das.. |mandatory| replace:: **mandatory value**
45*9bb1b549SSpandan Das
46*9bb1b549SSpandan DasThis document describes workspace rules, functions, and dependencies intended
47*9bb1b549SSpandan Dasto be used in the ``WORKSPACE`` file.a
48*9bb1b549SSpandan Das
49*9bb1b549SSpandan DasSee also the `toolchains`_ for information on `go_register_toolchains`_ and
50*9bb1b549SSpandan Dasother rules used to download and register toolchains.
51*9bb1b549SSpandan Das
52*9bb1b549SSpandan DasContents
53*9bb1b549SSpandan Das--------
54*9bb1b549SSpandan Das
55*9bb1b549SSpandan Das* `go_rules_dependencies`_
56*9bb1b549SSpandan Das* `Proto dependencies`_
57*9bb1b549SSpandan Das* `gRPC dependencies`_
58*9bb1b549SSpandan Das* `Overriding dependencies`_
59*9bb1b549SSpandan Das
60*9bb1b549SSpandan Das
61*9bb1b549SSpandan Dasgo_rules_dependencies
62*9bb1b549SSpandan Das---------------------
63*9bb1b549SSpandan Das
64*9bb1b549SSpandan Das``go_rules_dependencies`` is a function that registers external dependencies
65*9bb1b549SSpandan Dasneeded by the Go rules. Projects that use rules_go should *always* call it from
66*9bb1b549SSpandan DasWORKSPACE. It may be called before or after other workspace rules.
67*9bb1b549SSpandan Das
68*9bb1b549SSpandan DasSee `Overriding dependencies`_ for instructions on using a different version
69*9bb1b549SSpandan Dasof one of the repositories below.
70*9bb1b549SSpandan Das
71*9bb1b549SSpandan Das``go_rules_dependencies`` declares the repositories in the table below.
72*9bb1b549SSpandan DasIt also declares some internal repositories not described here.
73*9bb1b549SSpandan Das
74*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
75*9bb1b549SSpandan Das| **Name**                                        | **Path**                                  |
76*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
77*9bb1b549SSpandan Das| :value:`bazel_skylib`                           | `github.com/bazelbuild/bazel-skylib`_     |
78*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
79*9bb1b549SSpandan Das| A library of useful Starlark functions, used in the implementation                          |
80*9bb1b549SSpandan Das| of rules_go.                                                                                |
81*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
82*9bb1b549SSpandan Das| :value:`org_golang_x_tools`                     | `golang.org/x/tools`_                     |
83*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
84*9bb1b549SSpandan Das| The Go tools module. Provides the analysis framework that nogo_ is based on.                |
85*9bb1b549SSpandan Das| Also provides other package loading and testing infrastructure.                             |
86*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
87*9bb1b549SSpandan Das| :value:`com_github_golang_protobuf`             | `github.com/golang/protobuf`_             |
88*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
89*9bb1b549SSpandan Das| The Go protobuf plugin and runtime. When overriding this, make sure to use                  |
90*9bb1b549SSpandan Das| ``@io_bazel_rules_go//third_party:com_github_golang_protobuf-extras.patch``.                |
91*9bb1b549SSpandan Das| This is needed to support both pre-generated and dynamically generated                      |
92*9bb1b549SSpandan Das| proto libraries.                                                                            |
93*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
94*9bb1b549SSpandan Das| :value:`com_github_mwitkow_go_proto_validators` | `github.com/mwitkow/go-proto-validators`_ |
95*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
96*9bb1b549SSpandan Das| Legacy definition for proto plugin. Ideally ``go_rules_dependencies`` should                |
97*9bb1b549SSpandan Das| not provide this.                                                                           |
98*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
99*9bb1b549SSpandan Das| :value:`com_github_gogo_protobuf`               | `github.com/gogo/protobuf`_               |
100*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
101*9bb1b549SSpandan Das| Legacy definition for proto plugins. Ideally ``go_rules_dependencies`` should               |
102*9bb1b549SSpandan Das| not provide this.                                                                           |
103*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
104*9bb1b549SSpandan Das| :value:`org_golang_google_genproto`             | `google.golang.org/genproto`_             |
105*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
106*9bb1b549SSpandan Das| Pre-generated proto libraries for gRPC and Google APIs. Ideally,                            |
107*9bb1b549SSpandan Das| ``go_rules_dependencies`` should provide this, but it doesn't change often,                 |
108*9bb1b549SSpandan Das| and many things break without it.                                                           |
109*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
110*9bb1b549SSpandan Das| :value:`go_googleapis`                          | `github.com/googleapis/googleapis`_       |
111*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
112*9bb1b549SSpandan Das| Like :value:`org_golang_google_genproto` but provides ``go_proto_library``                  |
113*9bb1b549SSpandan Das| targets instead of ``go_library``. Ideally we should use                                    |
114*9bb1b549SSpandan Das| ``com_google_googleapis``, but Gazelle still resolves imports to this repo.                 |
115*9bb1b549SSpandan Das| See `#1986`_.                                                                               |
116*9bb1b549SSpandan Das+-------------------------------------------------+-------------------------------------------+
117*9bb1b549SSpandan Das
118*9bb1b549SSpandan DasProto dependencies
119*9bb1b549SSpandan Das------------------
120*9bb1b549SSpandan Das
121*9bb1b549SSpandan DasIn order to build `proto_library`_ and `go_proto_library`_ rules, you must
122*9bb1b549SSpandan Dasadd a dependency on ``com_google_protobuf`` in order to build the ``protoc``
123*9bb1b549SSpandan Dascompiler. Version 3.14.0 is the minimum supported version, but higher minor
124*9bb1b549SSpandan Dasversions shoudl work. You'll need a C/C++ toolchain for the execution platform
125*9bb1b549SSpandan Dasto build ``protoc``.
126*9bb1b549SSpandan Das
127*9bb1b549SSpandan Das.. code:: bzl
128*9bb1b549SSpandan Das
129*9bb1b549SSpandan Das    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
130*9bb1b549SSpandan Das
131*9bb1b549SSpandan Das    http_archive(
132*9bb1b549SSpandan Das        name = "com_google_protobuf",
133*9bb1b549SSpandan Das        sha256 = "d0f5f605d0d656007ce6c8b5a82df3037e1d8fe8b121ed42e536f569dec16113",
134*9bb1b549SSpandan Das        strip_prefix = "protobuf-3.14.0",
135*9bb1b549SSpandan Das        urls = [
136*9bb1b549SSpandan Das            "https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz",
137*9bb1b549SSpandan Das            "https://github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz",
138*9bb1b549SSpandan Das        ],
139*9bb1b549SSpandan Das    )
140*9bb1b549SSpandan Das
141*9bb1b549SSpandan Das    load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
142*9bb1b549SSpandan Das
143*9bb1b549SSpandan Das    protobuf_deps()
144*9bb1b549SSpandan Das
145*9bb1b549SSpandan DasThe `proto_library`_ rule is provided by the `rules_proto`_
146*9bb1b549SSpandan Dasrepository. ``protoc-gen-go``, the Go proto compiler plugin, is provided by the
147*9bb1b549SSpandan Dasrepository ``com_github_golang_protobuf``. Both are declared by
148*9bb1b549SSpandan Das`go_rules_dependencies`_  by default. You won't need to declare an
149*9bb1b549SSpandan Dasexplicit dependency unless you specifically want to use a different version. See
150*9bb1b549SSpandan Das`Overriding dependencies`_ for instructions on using a different version.
151*9bb1b549SSpandan Das
152*9bb1b549SSpandan DasgRPC dependencies
153*9bb1b549SSpandan Das-----------------
154*9bb1b549SSpandan Das
155*9bb1b549SSpandan DasIn order to build ``go_proto_library`` rules with the gRPC plugin,
156*9bb1b549SSpandan Dasseveral additional dependencies are needed. At minimum, you'll need to
157*9bb1b549SSpandan Dasdeclare ``org_golang_google_grpc``, ``org_golang_x_net``, and
158*9bb1b549SSpandan Das``org_golang_x_text``.
159*9bb1b549SSpandan Das
160*9bb1b549SSpandan DasIf you're using Gazelle, and you already import ``google.golang.org/grpc``
161*9bb1b549SSpandan Dasfrom a .go file somewhere in your repository, and you're also using Go modules
162*9bb1b549SSpandan Dasto manage dependencies, you can generate these rules with
163*9bb1b549SSpandan Das``bazel run //:gazelle -- update-repos -from_file=go.mod``.
164*9bb1b549SSpandan Das
165*9bb1b549SSpandan DasMake sure you set ``build_file_proto_mode = "disable"`` on the
166*9bb1b549SSpandan Das`go_repository`_ rule for ``org_golang_google_grpc``.
167*9bb1b549SSpandan Das
168*9bb1b549SSpandan DasFor example:
169*9bb1b549SSpandan Das
170*9bb1b549SSpandan Das.. code:: bzl
171*9bb1b549SSpandan Das
172*9bb1b549SSpandan Das    load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
173*9bb1b549SSpandan Das
174*9bb1b549SSpandan Das    gazelle_dependencies()
175*9bb1b549SSpandan Das
176*9bb1b549SSpandan Das    go_repository(
177*9bb1b549SSpandan Das        name = "org_golang_google_grpc",
178*9bb1b549SSpandan Das        build_file_proto_mode = "disable",
179*9bb1b549SSpandan Das        importpath = "google.golang.org/grpc",
180*9bb1b549SSpandan Das        sum = "h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw=",
181*9bb1b549SSpandan Das        version = "v1.22.0",
182*9bb1b549SSpandan Das    )
183*9bb1b549SSpandan Das
184*9bb1b549SSpandan Das    go_repository(
185*9bb1b549SSpandan Das        name = "org_golang_x_net",
186*9bb1b549SSpandan Das        importpath = "golang.org/x/net",
187*9bb1b549SSpandan Das        sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=",
188*9bb1b549SSpandan Das        version = "v0.0.0-20190311183353-d8887717615a",
189*9bb1b549SSpandan Das    )
190*9bb1b549SSpandan Das
191*9bb1b549SSpandan Das    go_repository(
192*9bb1b549SSpandan Das        name = "org_golang_x_text",
193*9bb1b549SSpandan Das        importpath = "golang.org/x/text",
194*9bb1b549SSpandan Das        sum = "h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=",
195*9bb1b549SSpandan Das        version = "v0.3.0",
196*9bb1b549SSpandan Das    )
197*9bb1b549SSpandan Das
198*9bb1b549SSpandan DasOverriding dependencies
199*9bb1b549SSpandan Das-----------------------
200*9bb1b549SSpandan Das
201*9bb1b549SSpandan DasYou can override a dependency declared in ``go_rules_dependencies`` by
202*9bb1b549SSpandan Dasdeclaring a repository rule in WORKSPACE with the same name *before* the call
203*9bb1b549SSpandan Dasto ``go_rules_dependencies``.
204*9bb1b549SSpandan Das
205*9bb1b549SSpandan DasFor example, this is how you would override ``com_github_golang_protobuf``:
206*9bb1b549SSpandan Das
207*9bb1b549SSpandan Das.. code:: bzl
208*9bb1b549SSpandan Das
209*9bb1b549SSpandan Das    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
210*9bb1b549SSpandan Das    load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
211*9bb1b549SSpandan Das
212*9bb1b549SSpandan Das    http_archive(
213*9bb1b549SSpandan Das        name = "io_bazel_rules_go",
214*9bb1b549SSpandan Das        sha256 = "7b9bbe3ea1fccb46dcfa6c3f3e29ba7ec740d8733370e21cdc8937467b4a4349",
215*9bb1b549SSpandan Das        urls = [
216*9bb1b549SSpandan Das            "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.22.4/rules_go-v0.22.4.tar.gz",
217*9bb1b549SSpandan Das            "https://github.com/bazelbuild/rules_go/releases/download/v0.22.4/rules_go-v0.22.4.tar.gz",
218*9bb1b549SSpandan Das        ],
219*9bb1b549SSpandan Das    )
220*9bb1b549SSpandan Das
221*9bb1b549SSpandan Das    http_archive(
222*9bb1b549SSpandan Das        name = "bazel_gazelle",
223*9bb1b549SSpandan Das        sha256 = "d8c45ee70ec39a57e7a05e5027c32b1576cc7f16d9dd37135b0eddde45cf1b10",
224*9bb1b549SSpandan Das        urls = [
225*9bb1b549SSpandan Das            "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/bazel-gazelle/releases/download/v0.20.0/bazel-gazelle-v0.20.0.tar.gz",
226*9bb1b549SSpandan Das            "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.20.0/bazel-gazelle-v0.20.0.tar.gz",
227*9bb1b549SSpandan Das        ],
228*9bb1b549SSpandan Das    )
229*9bb1b549SSpandan Das
230*9bb1b549SSpandan Das    http_archive(
231*9bb1b549SSpandan Das        name = "com_google_protobuf",
232*9bb1b549SSpandan Das        sha256 = "d0f5f605d0d656007ce6c8b5a82df3037e1d8fe8b121ed42e536f569dec16113",
233*9bb1b549SSpandan Das        strip_prefix = "protobuf-3.14.0",
234*9bb1b549SSpandan Das        urls = [
235*9bb1b549SSpandan Das            "https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz",
236*9bb1b549SSpandan Das            "https://github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz",
237*9bb1b549SSpandan Das        ],
238*9bb1b549SSpandan Das    )
239*9bb1b549SSpandan Das
240*9bb1b549SSpandan Das    load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
241*9bb1b549SSpandan Das    load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
242*9bb1b549SSpandan Das    load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
243*9bb1b549SSpandan Das
244*9bb1b549SSpandan Das    go_repository(
245*9bb1b549SSpandan Das        name = "com_github_golang_protobuf",
246*9bb1b549SSpandan Das        build_file_proto_mode = "disable_global",
247*9bb1b549SSpandan Das        importpath = "github.com/golang/protobuf",
248*9bb1b549SSpandan Das        patch_args = ["-p1"],
249*9bb1b549SSpandan Das        patches = ["@io_bazel_rules_go//third_party:com_github_golang_protobuf-extras.patch"],
250*9bb1b549SSpandan Das        sum = "h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=",
251*9bb1b549SSpandan Das        version = "v1.3.5",
252*9bb1b549SSpandan Das    )
253*9bb1b549SSpandan Das
254*9bb1b549SSpandan Das    go_rules_dependencies()
255*9bb1b549SSpandan Das
256*9bb1b549SSpandan Das    go_register_toolchains()
257*9bb1b549SSpandan Das
258*9bb1b549SSpandan Das    gazelle_dependencies()
259*9bb1b549SSpandan Das
260*9bb1b549SSpandan Das    protobuf_deps()
261*9bb1b549SSpandan Das
262*9bb1b549SSpandan DasSome of the dependencies declared by ``go_rules_dependencies`` require
263*9bb1b549SSpandan Dasadditional patches and or adjustments compared to what `go_repository`_
264*9bb1b549SSpandan Dasgenerates by default (as ``com_github_golang_protobuf`` does in the example
265*9bb1b549SSpandan Dasabove). Patches may be found in the `third_party`_ directory.
266*9bb1b549SSpandan DasSee notes in `repositories.bzl`_. If you're generated build files with
267*9bb1b549SSpandan Das`go_repository`_, you do not need the ``*-gazelle.patch`` files.
268