Skip to content

Commit ed7e66d

Browse files
authored
Update resource_strip_prefix logic to support path handling across modules (#1389)
* Add nested module resources example and update resource_strip_prefix handling - Add an example with a nested module structure - Update `resource_strip_prefix` logic to support path handling across modules * Fix * Write unit tests * Fix test
1 parent f63ca67 commit ed7e66d

File tree

17 files changed

+295
-13
lines changed

17 files changed

+295
-13
lines changed

.bazelrc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ common --enable_runfiles
1515

1616
# To update these lines, execute
1717
# `bazel run @rules_bazel_integration_test//tools:update_deleted_packages`
18-
build --deleted_packages=.bazelbsp,.bazelbsp/aspects,examples/android,examples/android/app,examples/android/bzl,examples/android/libAndroid,examples/android/libJava,examples/android/libKtAndroid,examples/android/libKtAndroid/src/test/java/examples/android/lib,examples/android/third_party,examples/anvil,examples/anvil/app,examples/anvil/app/src/androidTest/java/com/squareup/anvil/sample,examples/anvil/app/src/main/java/com/squareup/anvil/sample,examples/anvil/app/src/test/java/com/squareup/anvil/sample,examples/anvil/library,examples/anvil/library/src/main/java/com/squareup/anvil/sample,examples/anvil/repro/src/main/java/com/repro/lib,examples/anvil/scopes,examples/anvil/scopes/src/main/java/com/squareup/scopes,examples/anvil/third_party,examples/associates,examples/associates/projects/core/api,examples/associates/projects/core/api/src/test/kotlin/core/api,examples/associates/projects/core/impl,examples/associates/projects/core/impl/src/test/kotlin/core/impl,examples/dagger,examples/dagger/third_party,examples/deps,examples/deps/bzl,examples/deps/libAndroid1,examples/deps/libAndroid2,examples/deps/libAndroid3,examples/deps/libAndroid4,examples/deps/libJava1,examples/deps/libJava2,examples/deps/libJava3,examples/deps/libJava4,examples/deps/libKt1,examples/deps/libKt2,examples/deps/libKt3,examples/deps/libKt4,examples/deps/libKtAndroid1,examples/deps/libKtAndroid2,examples/deps/libKtAndroid3,examples/deps/libKtAndroid4,examples/jetpack_compose,examples/jetpack_compose/app,examples/jetpack_compose/compose-ui,examples/ksp,examples/ksp/third_party,examples/multiplex,examples/multiplex/src,examples/plugin,examples/plugin/src/allopen,examples/plugin/src/allopennoarg,examples/plugin/src/noarg,examples/plugin/src/parcelize,examples/plugin/src/sam_with_receiver,examples/plugin/src/serialization,examples/trivial,examples/trivial/app,src/main/starlark/release_archive
19-
query --deleted_packages=.bazelbsp,.bazelbsp/aspects,examples/android,examples/android/app,examples/android/bzl,examples/android/libAndroid,examples/android/libJava,examples/android/libKtAndroid,examples/android/libKtAndroid/src/test/java/examples/android/lib,examples/android/third_party,examples/anvil,examples/anvil/app,examples/anvil/app/src/androidTest/java/com/squareup/anvil/sample,examples/anvil/app/src/main/java/com/squareup/anvil/sample,examples/anvil/app/src/test/java/com/squareup/anvil/sample,examples/anvil/library,examples/anvil/library/src/main/java/com/squareup/anvil/sample,examples/anvil/repro/src/main/java/com/repro/lib,examples/anvil/scopes,examples/anvil/scopes/src/main/java/com/squareup/scopes,examples/anvil/third_party,examples/associates,examples/associates/projects/core/api,examples/associates/projects/core/api/src/test/kotlin/core/api,examples/associates/projects/core/impl,examples/associates/projects/core/impl/src/test/kotlin/core/impl,examples/dagger,examples/dagger/third_party,examples/deps,examples/deps/bzl,examples/deps/libAndroid1,examples/deps/libAndroid2,examples/deps/libAndroid3,examples/deps/libAndroid4,examples/deps/libJava1,examples/deps/libJava2,examples/deps/libJava3,examples/deps/libJava4,examples/deps/libKt1,examples/deps/libKt2,examples/deps/libKt3,examples/deps/libKt4,examples/deps/libKtAndroid1,examples/deps/libKtAndroid2,examples/deps/libKtAndroid3,examples/deps/libKtAndroid4,examples/jetpack_compose,examples/jetpack_compose/app,examples/jetpack_compose/compose-ui,examples/ksp,examples/ksp/third_party,examples/multiplex,examples/multiplex/src,examples/plugin,examples/plugin/src/allopen,examples/plugin/src/allopennoarg,examples/plugin/src/noarg,examples/plugin/src/parcelize,examples/plugin/src/sam_with_receiver,examples/plugin/src/serialization,examples/trivial,examples/trivial/app,src/main/starlark/release_archive
18+
build --deleted_packages=.bazelbsp,.bazelbsp/aspects,examples/android,examples/android/app,examples/android/bzl,examples/android/libAndroid,examples/android/libJava,examples/android/libKtAndroid,examples/android/libKtAndroid/src/test/java/examples/android/lib,examples/android/third_party,examples/anvil,examples/anvil/app,examples/anvil/app/src/androidTest/java/com/squareup/anvil/sample,examples/anvil/app/src/main/java/com/squareup/anvil/sample,examples/anvil/app/src/test/java/com/squareup/anvil/sample,examples/anvil/library,examples/anvil/library/src/main/java/com/squareup/anvil/sample,examples/anvil/repro/src/main/java/com/repro/lib,examples/anvil/scopes,examples/anvil/scopes/src/main/java/com/squareup/scopes,examples/anvil/third_party,examples/associates,examples/associates/projects/core/api,examples/associates/projects/core/api/src/test/kotlin/core/api,examples/associates/projects/core/impl,examples/associates/projects/core/impl/src/test/kotlin/core/impl,examples/dagger,examples/dagger/third_party,examples/deps,examples/deps/bzl,examples/deps/libAndroid1,examples/deps/libAndroid2,examples/deps/libAndroid3,examples/deps/libAndroid4,examples/deps/libJava1,examples/deps/libJava2,examples/deps/libJava3,examples/deps/libJava4,examples/deps/libKt1,examples/deps/libKt2,examples/deps/libKt3,examples/deps/libKt4,examples/deps/libKtAndroid1,examples/deps/libKtAndroid2,examples/deps/libKtAndroid3,examples/deps/libKtAndroid4,examples/jetpack_compose,examples/jetpack_compose/app,examples/jetpack_compose/compose-ui,examples/ksp,examples/ksp/third_party,examples/multiplex,examples/multiplex/src,examples/nested_module_resources,examples/nested_module_resources/nested,examples/plugin,examples/plugin/src/allopen,examples/plugin/src/allopennoarg,examples/plugin/src/noarg,examples/plugin/src/parcelize,examples/plugin/src/sam_with_receiver,examples/plugin/src/serialization,examples/trivial,examples/trivial/app,src/main/starlark/release_archive
19+
query --deleted_packages=.bazelbsp,.bazelbsp/aspects,examples/android,examples/android/app,examples/android/bzl,examples/android/libAndroid,examples/android/libJava,examples/android/libKtAndroid,examples/android/libKtAndroid/src/test/java/examples/android/lib,examples/android/third_party,examples/anvil,examples/anvil/app,examples/anvil/app/src/androidTest/java/com/squareup/anvil/sample,examples/anvil/app/src/main/java/com/squareup/anvil/sample,examples/anvil/app/src/test/java/com/squareup/anvil/sample,examples/anvil/library,examples/anvil/library/src/main/java/com/squareup/anvil/sample,examples/anvil/repro/src/main/java/com/repro/lib,examples/anvil/scopes,examples/anvil/scopes/src/main/java/com/squareup/scopes,examples/anvil/third_party,examples/associates,examples/associates/projects/core/api,examples/associates/projects/core/api/src/test/kotlin/core/api,examples/associates/projects/core/impl,examples/associates/projects/core/impl/src/test/kotlin/core/impl,examples/dagger,examples/dagger/third_party,examples/deps,examples/deps/bzl,examples/deps/libAndroid1,examples/deps/libAndroid2,examples/deps/libAndroid3,examples/deps/libAndroid4,examples/deps/libJava1,examples/deps/libJava2,examples/deps/libJava3,examples/deps/libJava4,examples/deps/libKt1,examples/deps/libKt2,examples/deps/libKt3,examples/deps/libKt4,examples/deps/libKtAndroid1,examples/deps/libKtAndroid2,examples/deps/libKtAndroid3,examples/deps/libKtAndroid4,examples/jetpack_compose,examples/jetpack_compose/app,examples/jetpack_compose/compose-ui,examples/ksp,examples/ksp/third_party,examples/multiplex,examples/multiplex/src,examples/nested_module_resources,examples/nested_module_resources/nested,examples/plugin,examples/plugin/src/allopen,examples/plugin/src/allopennoarg,examples/plugin/src/noarg,examples/plugin/src/parcelize,examples/plugin/src/sam_with_receiver,examples/plugin/src/serialization,examples/trivial,examples/trivial/app,src/main/starlark/release_archive
2020

2121
# User-specific .bazelrc
2222
try-import %workspace%/user.bazelrc

BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ test_suite(
4141
"//src/test/kotlin/io/bazel/kotlin/builder:builder_tests",
4242
"//src/test/kotlin/io/bazel/worker:worker_tests",
4343
"//src/test/starlark:convert_tests",
44+
"//src/test/starlark:resource_strip_prefix_tests",
4445
],
4546
)
4647

@@ -52,6 +53,7 @@ test_suite(
5253
"//src/test/kotlin/io/bazel/kotlin:local_assertion_tests",
5354
"//src/test/kotlin/io/bazel/worker:local_worker_tests",
5455
"//src/test/starlark:convert_tests",
56+
"//src/test/starlark:resource_strip_prefix_tests",
5557
],
5658
)
5759

MODULE.bazel

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ bazel_dep(name = "rules_proto", version = "6.0.2", repo_name = "rules_proto")
1010
bazel_dep(name = "abseil-py", version = "2.1.0", repo_name = "py_absl")
1111
bazel_dep(name = "rules_cc", version = "0.0.16")
1212
bazel_dep(name = "platforms", version = "0.0.11")
13-
bazel_dep(name = "bazel_skylib", version = "1.7.1")
13+
bazel_dep(name = "bazel_skylib", version = "1.8.2")
1414
bazel_dep(name = "rules_java", version = "8.9.0")
1515
bazel_dep(name = "rules_python", version = "0.23.1")
1616
bazel_dep(name = "rules_android", version = "0.6.4")
@@ -109,7 +109,7 @@ use_repo(maven, "kotlin_rules_maven", "unpinned_kotlin_rules_maven")
109109
bazel_dep(name = "rules_pkg", version = "1.0.1")
110110
bazel_dep(name = "stardoc", version = "0.8.0", repo_name = "io_bazel_stardoc")
111111

112-
bazel_dep(name = "rules_testing", version = "0.5.0", dev_dependency = True)
112+
bazel_dep(name = "rules_testing", version = "0.9.0", dev_dependency = True)
113113
bazel_dep(name = "rules_bazel_integration_test", version = "0.34.0", dev_dependency = True)
114114

115115
bazel_binaries = use_extension("@rules_bazel_integration_test//:extensions.bzl", "bazel_binaries", dev_dependency = True)

docs/kotlin.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ It is appropriate for building workspace utilities. `java_binary` should be pref
7070
| <a id="kt_jvm_binary-module_name"></a>module_name | The name of the module, if not provided the module name is derived from the label. --e.g., `//some/package/path:label_name` is translated to `some_package_path-label_name`. | String | optional | `""` |
7171
| <a id="kt_jvm_binary-plugins"></a>plugins | - | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
7272
| <a id="kt_jvm_binary-resource_jars"></a>resource_jars | Set of archives containing Java resources. If specified, the contents of these jars are merged into the output jar. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
73-
| <a id="kt_jvm_binary-resource_strip_prefix"></a>resource_strip_prefix | The path prefix to strip from Java resources, files residing under common prefix such as `src/main/resources` or `src/test/resources` or `kotlin` will have stripping applied by convention. | String | optional | `""` |
73+
| <a id="kt_jvm_binary-resource_strip_prefix"></a>resource_strip_prefix | The path prefix to strip from Java resources. Should be a label pointing to a directory. Files residing under common prefix such as `src/main/resources` or `src/test/resources` or `kotlin` will have stripping applied by convention if this is not specified. | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` |
7474
| <a id="kt_jvm_binary-runtime_deps"></a>runtime_deps | Libraries to make available to the final binary or test at runtime only. Like ordinary deps, these will appear on the runtime classpath, but unlike them, not on the compile-time classpath. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
7575

7676

@@ -166,7 +166,7 @@ This rule compiles and links Kotlin and Java sources into a .jar file.
166166
| <a id="kt_jvm_library-neverlink"></a>neverlink | If true only use this library for compilation and not at runtime. | Boolean | optional | `False` |
167167
| <a id="kt_jvm_library-plugins"></a>plugins | - | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
168168
| <a id="kt_jvm_library-resource_jars"></a>resource_jars | Set of archives containing Java resources. If specified, the contents of these jars are merged into the output jar. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
169-
| <a id="kt_jvm_library-resource_strip_prefix"></a>resource_strip_prefix | The path prefix to strip from Java resources, files residing under common prefix such as `src/main/resources` or `src/test/resources` or `kotlin` will have stripping applied by convention. | String | optional | `""` |
169+
| <a id="kt_jvm_library-resource_strip_prefix"></a>resource_strip_prefix | The path prefix to strip from Java resources. Should be a label pointing to a directory. Files residing under common prefix such as `src/main/resources` or `src/test/resources` or `kotlin` will have stripping applied by convention if this is not specified. | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` |
170170
| <a id="kt_jvm_library-runtime_deps"></a>runtime_deps | Libraries to make available to the final binary or test at runtime only. Like ordinary deps, these will appear on the runtime classpath, but unlike them, not on the compile-time classpath. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
171171

172172

@@ -209,7 +209,7 @@ Setup a simple kotlin_test.
209209
| <a id="kt_jvm_test-module_name"></a>module_name | The name of the module, if not provided the module name is derived from the label. --e.g., `//some/package/path:label_name` is translated to `some_package_path-label_name`. | String | optional | `""` |
210210
| <a id="kt_jvm_test-plugins"></a>plugins | - | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
211211
| <a id="kt_jvm_test-resource_jars"></a>resource_jars | Set of archives containing Java resources. If specified, the contents of these jars are merged into the output jar. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
212-
| <a id="kt_jvm_test-resource_strip_prefix"></a>resource_strip_prefix | The path prefix to strip from Java resources, files residing under common prefix such as `src/main/resources` or `src/test/resources` or `kotlin` will have stripping applied by convention. | String | optional | `""` |
212+
| <a id="kt_jvm_test-resource_strip_prefix"></a>resource_strip_prefix | The path prefix to strip from Java resources. Should be a label pointing to a directory. Files residing under common prefix such as `src/main/resources` or `src/test/resources` or `kotlin` will have stripping applied by convention if this is not specified. | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` |
213213
| <a id="kt_jvm_test-runtime_deps"></a>runtime_deps | Libraries to make available to the final binary or test at runtime only. Like ordinary deps, these will appear on the runtime classpath, but unlike them, not on the compile-time classpath. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | `[]` |
214214
| <a id="kt_jvm_test-test_class"></a>test_class | The Java class to be loaded by the test runner. | String | optional | `""` |
215215

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_binary")
2+
3+
kt_jvm_binary(
4+
name = "main",
5+
srcs = glob(["*.kt"]),
6+
main_class = "MainKt",
7+
deps = ["@nested//:printer"],
8+
)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module(name = "nested_module_resources")
2+
3+
bazel_dep(name = "rules_kotlin", version = "1.9.5")
4+
local_path_override(
5+
module_name = "rules_kotlin",
6+
path = "../..",
7+
)
8+
9+
bazel_dep(name = "nested", version = "0")
10+
local_path_override(
11+
module_name = "nested",
12+
path = "nested",
13+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fun main() {
2+
printMessage()
3+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Nested Module Resources Example
2+
3+
## What This Tests
4+
5+
This example tests **resource path resolution across Bazel module boundaries** when using `resource_strip_prefix`.
6+
7+
## Problem Statement
8+
9+
When a target in one Bazel module depends on a library in an external Bazel module that has resources with a custom `resource_strip_prefix`, the resource paths need to be correctly resolved.
10+
11+
### Module Structure
12+
13+
```
14+
nested_module_resources/ # Main module
15+
├── MODULE.bazel # bazel_dep(name = "nested")
16+
├── Main.kt # Calls @nested//:printer
17+
└── nested/ # SEPARATE BAZEL MODULE
18+
├── MODULE.bazel # module(name = "nested")
19+
├── Printer.kt
20+
├── BUILD.bazel # resource_strip_prefix = "resourcez"
21+
└── resourcez/
22+
└── resource.txt
23+
```
24+
25+
**Key Point:** `nested/` is a separate Bazel module with its own `MODULE.bazel`, not just a subdirectory.
26+
27+
## The Bug (Before Fix)
28+
29+
Without the fix in PR #1390, resource paths from external modules included the module path prefix, causing the strip prefix check to fail:
30+
31+
### With nested/ in .bazelignore:
32+
```
33+
Error in fail: Resource file ../nested+/resourcez/resource.txt is not under
34+
the specified prefix to strip resourcez
35+
```
36+
- Resource path: `../nested+/resourcez/resource.txt`
37+
- Strip prefix: `resourcez`
38+
- Check fails: `../nested+/resourcez/resource.txt` doesn't start with `resourcez`
39+
40+
### Without .bazelignore:
41+
```
42+
Error in fail: Resource file nested/resourcez/resource.txt is not under
43+
the specified prefix to strip resourcez
44+
```
45+
- Resource path: `nested/resourcez/resource.txt`
46+
- Strip prefix: `resourcez`
47+
- Check fails: `nested/resourcez/resource.txt` doesn't start with `resourcez`
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
load("@rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library")
2+
3+
kt_jvm_library(
4+
name = "printer",
5+
srcs = glob(["*.kt"]),
6+
resource_strip_prefix = "resourcez",
7+
resources = glob(["resourcez/**"]),
8+
visibility = ["//visibility:public"],
9+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module(name = "nested")
2+
3+
bazel_dep(name = "rules_kotlin", version = "1.9.5")
4+
local_path_override(
5+
module_name = "rules_kotlin",
6+
path = "../../..",
7+
)

0 commit comments

Comments
 (0)