bazel-contrib / bazel-contrib/rules_go
Files in go_repository data attribute are linked inside dependent packages
- Dominant language
- Go
- Stars
- 1.5k
- Forks
- 760
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 12
Description
### What version of rules_go are you using?
0.19.1
### What version of gazelle are you using?
0.18.1
### What version of Bazel are you using?
0.28.1
### Does this issue reproduce with the latest releases of all the above?
Yes.
### What operating system and processor architecture are you using?
Darwin and linux, both amd64.
### What did you do?
Executed this rule:
```python
load("@io_bazel_rules_go//go:def.bzl", "go_path")
go_path(
name = "gqlgen_path",
mode = "copy",
deps = ["@com_github_99designs_gqlgen//:gqlgen"],
visibility = ["//visibility:public"],
)
```
for
```python
go_repository(
name = "com_github_99designs_gqlgen",
importpath = "github.com/99designs/gqlgen",
version = "v0.9.3",
sum = "h1:BWOMuDFhpuvzbuUFgCL1OSfAM2lvnYgpoCXetDvbnHY=",
patches = ["//:com_github_99designs_gqlgen.patch"],
)
```
Which applies a patch to list *.gotpl files inside the data attribute of the generated `BUILD` files:
```diff
diff -urN plugin/modelgen/BUILD.bazel plugin/modelgen/BUILD.bazel
--- plugin/modelgen/BUILD.bazel 2019-08-20 16:36:43.000000000 -0300
+++ plugin/modelgen/BUILD.bazel 2019-08-20 16:40:38.000000000 -0300
@@ -1,6 +1,7 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
+ data = ["models.gotpl"],
name = "go_default_library",
srcs = ["models.go"],
importpath = "github.com/99designs/gqlgen/plugin/modelgen",
```
Full `WORKSPACE` and patch files are pasted at the end of the issue.
### What did you expect to see?
The files specified in the data attributes should appear in their respective directories.
### What did you see instead?
The data files appear together in multiple directories:
```bash
cd bazel-genfiles/gqlgen_path/src/github.com/99designs
find -L . -name "object.gotpl" | wc -l
9
```
This seems related to package dependencies. For example, `bazel-genfiles/gqlgen_path/src/github.com/99designs/gqlgen/plugin/modelgen/` contains links to files that are not supposed to be in that directory, but belong to `com_github_99designs_gqlgen/codegen`.
The `go_library` rule for `com_github_99designs_gqlgen/plugin/modelgen/` is:
```python
go_library(
data = ["models.gotpl"],
name = "go_default_library",
srcs = ["models.go"],
importpath = "github.com/99designs/gqlgen/plugin/modelgen",
visibility = ["//visibility:public"],
deps = [
"//codegen/config:go_default_library",
"//codegen/templates:go_default_library",
"//internal/code:go_default_library",
"//plugin:go_default_library",
"@com_github_vektah_gqlparser//ast:go_default_library",
],
)
```
It depends on `//codegen/config` and `//codegen/config`. However, those libraries do not (explicitly?) depend on their parent, `//codegen`. Nevertheless, data files for `//codegen` are linked in the `github.com/99designs/gqlgen/plugin/modelgen` directory.
This is unexpected. What is also unexpected is that data files have this behavior, because even though the library depends on *.go files as well, those are not linked in the library's directory.
`WORKESPACE` file:
```python
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
rules_go_version = "0.19.1"
http_archive(
name = "io_bazel_rules_go",
sha256 = "8df59f11fb697743cbb3f26cfb8750395f30471e9eabde0d174c3aebc7a1cd39",
urls = [
"https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/{}/rules_go-{}.tar.gz".format(rules_go_version, rules_go_version),
"https://github.com/bazelbuild/rules_go/releases/download/{}/rules_go-{}.tar.gz".format(rules_go_version, rules_go_version),
],
)
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
go_rules_dependencies()
go_register_toolchains()
gazelle_version = "0.18.1"
http_archive(
name = "bazel_gazelle",
sha256 = "be9296bfd64882e3c08e3283c58fcb461fa6dd3c171764fcc4cf322f60615a9b",
urls = [
"https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/bazel-gazelle/releases/download/{}/bazel-gazelle-{}.tar.gz".format(gazelle_version, gazelle_version),
"https://github.com/bazelbuild/bazel-gazelle/releases/download/{}/bazel-gazelle-{}.tar.gz".format(gazelle_version, gazelle_version),
],
)
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
gazelle_dependencies()
go_repository(
name = "com_github_99designs_gqlgen",
importpath = "github.com/99designs/gqlgen",
version = "v0.9.3",
sum = "h1:BWOMuDFhpuvzbuUFgCL1OSfAM2lvnYgpoCXetDvbnHY=",
patches = ["//:com_github_99designs_gqlgen.patch"],
)
go_repository(
name = "com_github_pkg_errors",
importpath = "github.com/pkg/errors",
sum = "h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=",
version = "v0.8.1",
)
go_repository(
name = "com_github_urfave_cli",
importpath = "github.com/urfave/cli",
sum = "h1:wYSSj06510qPIzGSua9ZqsncMmWE3Zr55KBERygyrxE=",
version = "v1.21.0",
)
# Dependencies below
go_repository(
name = "in_gopkg_yaml_v2",
importpath = "gopkg.in/yaml.v2",
sum = "h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=",
version = "v2.2.2",
)
go_repository(
name = "com_github_vektah_gqlparser",
importpath = "github.com/vektah/gqlparser",
sum = "h1:ZsyLGn7/7jDNI+y4SEhI4yAxRChlv15pUHMjijT+e68=",
version = "v1.1.2",
)
go_repository(
name = "com_github_gorilla_websocket",
importpath = "github.com/gorilla/websocket",
sum = "h1:VJtLvh6VQym50czpZzx07z/kw9EgAxI3x1ZB8taTMQQ=",
version = "v1.2.0",
)
go_repository(
name = "com_github_agnivade_levenshtein",
importpath = "github.com/agnivade/levenshtein",
sum = "h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ=",
version = "v1.0.1",
)
go_repository(
name = "com_github_hashicorp_golang_lru",
importpath = "github.com/hashicorp/golang-lru",
sum = "h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=",
version = "v0.5.0",
)
```
Path file:
```diff
diff -urN codegen/BUILD.bazel codegen/BUILD.bazel
--- codegen/BUILD.bazel 2019-08-20 16:36:43.000000000 -0300
+++ codegen/BUILD.bazel 2019-08-20 16:40:02.000000000 -0300
@@ -1,6 +1,16 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
+ data = [
+ "directives.gotpl",
+ "args.gotpl",
+ "field.gotpl",
+ "type.gotpl",
+ "generated!.gotpl",
+ "interface.gotpl",
+ "input.gotpl",
+ "object.gotpl"
+ ],
name = "go_default_library",
srcs = [
"args.go",
diff -urN plugin/modelgen/BUILD.bazel plugin/modelgen/BUILD.bazel
--- plugin/modelgen/BUILD.bazel 2019-08-20 16:36:43.000000000 -0300
+++ plugin/modelgen/BUILD.bazel 2019-08-20 16:40:38.000000000 -0300
@@ -1,6 +1,7 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
+ data = ["models.gotpl"],
name = "go_default_library",
srcs = ["models.go"],
importpath = "github.com/99designs/gqlgen/plugin/modelgen",
diff -urN plugin/resolvergen/BUILD.bazel plugin/resolvergen/BUILD.bazel
--- plugin/resolvergen/BUILD.bazel 2019-08-20 16:36:43.000000000 -0300
+++ plugin/resolvergen/BUILD.bazel 2019-08-20 16:41:20.000000000 -0300
@@ -1,6 +1,7 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
+ data = ["resolver.gotpl"],
name = "go_default_library",
srcs = ["resolver.go"],
importpath = "github.com/99designs/gqlgen/plugin/resolvergen",
diff -urN plugin/stubgen/BUILD.bazel plugin/stubgen/BUILD.bazel
--- plugin/stubgen/BUILD.bazel 2019-08-20 16:36:43.000000000 -0300
+++ plugin/stubgen/BUILD.bazel 2019-08-20 16:42:09.000000000 -0300
@@ -1,6 +1,7 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
+ data = ["stubs.gotpl"],
name = "go_default_library",
srcs = ["stubs.go"],
importpath = "github.com/99designs/gqlgen/plugin/stubgen",
```
Contributor guide
Research direction
Reproduce the issue with the supplied WORKSPACE, go_repository, go_path rule, and patch, then inspect the generated BUILD files and bazel-genfiles symlink tree. Done means data files declared for each package appear only in their respective directories, without unrelated dependency files being linked there.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go
- Domain
- build-system
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100