Skip to content

Commit 54cf66c

Browse files
authored
Targeting fixes (#470)
* nuget_archive: Fall back to netstandard TFMs for cor and netfx Without this change, the following scenario fails: - csharp_library rule targets net8.0 + depends on 3rd-party package - 3rd-party package has targets ["net9.0", "netstandard2.0"] In this case, MSBuild will fall back to netstandard2.0. This change replicates that behavior. * nuget_repo: Ensure different versions in repo have unique TPO/frameworks dotnet.targeting_packs.bzl contains a nuget_repo declaration for the different targeting packs available on different .NET versions. However, when generating the repo, the latter versions would silently override the former versions' targeting_pack_overrides and framework_list, and thus older versions like microsoft.aspnetcore.app.ref.v8.0.11 would have targeting_pack_overrides containing version 9.0.0 and such. This change ensures that different packages within the same repo do not clobber each other's parameters.
1 parent 4fbb4be commit 54cf66c

File tree

9 files changed

+381
-11
lines changed

9 files changed

+381
-11
lines changed

dotnet/private/rules/nuget/nuget_archive.bzl

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,14 +611,20 @@ def tfm_filegroup(name, tfms):
611611
if net:
612612
native.alias(
613613
name = "%s_net" % name,
614-
actual = select({"@rules_dotnet//dotnet:tfm_%s" % tfm: target for (tfm, target) in net}),
614+
actual = select(
615+
{"@rules_dotnet//dotnet:tfm_%s" % tfm: target for (tfm, target) in net} |
616+
{"//conditions:default": ":%s_std" % name},
617+
),
615618
visibility = ["//visibility:public"],
616619
)
617620

618621
if cor:
619622
native.alias(
620623
name = "%s_cor" % name,
621-
actual = select({"@rules_dotnet//dotnet:tfm_%s" % tfm: target for (tfm, target) in cor}),
624+
actual = select(
625+
{"@rules_dotnet//dotnet:tfm_%s" % tfm: target for (tfm, target) in cor} |
626+
{"//conditions:default": ":%s_std" % name},
627+
),
622628
visibility = ["//visibility:public"],
623629
)
624630

dotnet/private/rules/nuget/nuget_repo.bzl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ def _nuget_repo_impl(ctx):
2020
sha512 = package["sha512"]
2121
deps = package["dependencies"]
2222

23-
targeting_pack_overrides = ctx.attr.targeting_pack_overrides[id.lower()]
24-
framework_list = ctx.attr.framework_list[id.lower()]
23+
targeting_pack_overrides = ctx.attr.targeting_pack_overrides["{}|{}".format(id.lower(), version)]
24+
framework_list = ctx.attr.framework_list["{}|{}".format(id.lower(), version)]
2525

2626
ctx.template("{}/{}/BUILD.bazel".format(id.lower(), version), ctx.attr._template, {
2727
"{PREFIX}": _GLOBAL_NUGET_PREFIX,
@@ -90,6 +90,6 @@ def nuget_repo(name, packages):
9090
name = name,
9191
repo_name = name,
9292
packages = [json.encode(package) for package in packages],
93-
targeting_pack_overrides = {"{}".format(package["id"].lower()): package["targeting_pack_overrides"] for package in packages},
94-
framework_list = {"{}".format(package["id"].lower()): package["framework_list"] for package in packages},
93+
targeting_pack_overrides = {"{}|{}".format(package["id"].lower(), package["version"]): package["targeting_pack_overrides"] for package in packages},
94+
framework_list = {"{}|{}".format(package["id"].lower(), package["version"]): package["framework_list"] for package in packages},
9595
)

dotnet/private/tests/nuget_structure/common.bzl

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,50 @@ nuget_structure_test = analysistest.make(
100100
},
101101
)
102102

103+
def _nuget_targeting_pack_overrides_test_impl(ctx):
104+
env = analysistest.begin(ctx)
105+
106+
target_under_test = analysistest.target_under_test(env)
107+
nuget_provider = target_under_test[NuGetInfo]
108+
109+
targeting_pack_overrides = nuget_provider.targeting_pack_overrides
110+
asserts.true(
111+
env,
112+
sorted(ctx.attr.expected_targeting_pack_overrides) == sorted(targeting_pack_overrides),
113+
"\nExpected targeting_pack_overrides:\n{}\nActual targeting_pack_overrides:\n{}".format(ctx.attr.expected_targeting_pack_overrides, targeting_pack_overrides),
114+
)
115+
116+
return analysistest.end(env)
117+
118+
nuget_targeting_pack_overrides_test = analysistest.make(
119+
_nuget_targeting_pack_overrides_test_impl,
120+
attrs = {
121+
"expected_targeting_pack_overrides": attr.string_dict(default = {}),
122+
},
123+
)
124+
125+
def _nuget_framework_list_test_impl(ctx):
126+
env = analysistest.begin(ctx)
127+
128+
target_under_test = analysistest.target_under_test(env)
129+
nuget_provider = target_under_test[NuGetInfo]
130+
131+
framework_list = nuget_provider.framework_list
132+
asserts.true(
133+
env,
134+
sorted(ctx.attr.expected_framework_list) == sorted(framework_list),
135+
"\nExpected framework_list:\n{}\nActual framework_list:\n{}".format(ctx.attr.expected_framework_list, framework_list),
136+
)
137+
138+
return analysistest.end(env)
139+
140+
nuget_framework_list_test = analysistest.make(
141+
_nuget_framework_list_test_impl,
142+
attrs = {
143+
"expected_framework_list": attr.string_dict(default = {}),
144+
},
145+
)
146+
103147
def _nuget_test_wrapper(ctx):
104148
return [ctx.attr.package[0][DotnetAssemblyCompileInfo], ctx.attr.package[0][DotnetAssemblyRuntimeInfo], ctx.attr.package[0][NuGetInfo]]
105149

dotnet/private/tests/nuget_structure/targetingpacks.bzl

Lines changed: 307 additions & 1 deletion
Large diffs are not rendered by default.

e2e/net8.0/basic_csharp/BUILD.bazel

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,9 @@ csharp_library(
2929
srcs = ["lib.cs"],
3030
internals_visible_to = ["lib_test"],
3131
target_frameworks = ["net8.0"],
32-
deps = [],
32+
deps = [
33+
# This package only supports net9.0 and netstandard2.0 TFMs.
34+
# rules_dotnet should be able to fall back to netstandard2.0.
35+
"@paket.main//microsoft.net.stringtools",
36+
],
3337
)

e2e/net8.0/dotnet-tools.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"isRoot": true,
44
"tools": {
55
"paket": {
6-
"version": "8.0.0",
6+
"version": "9.0.2",
77
"commands": ["paket"]
88
}
99
}

e2e/net8.0/paket.dependencies

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ source https://api.nuget.org/v3/index.json
44

55
nuget FSharp.Core 8.0.100
66
nuget Microsoft.NETCore.App.Ref 8.0.0
7+
# Used for testing of the .NET Standard fallback.
8+
nuget Microsoft.NET.StringTools 17.13.9

e2e/net8.0/paket.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,9 @@ RESTRICTION: == net8.0
33
NUGET
44
remote: https://api.nuget.org/v3/index.json
55
FSharp.Core (8.0.100)
6+
Microsoft.NET.StringTools (17.13.9)
7+
System.Memory (>= 4.5.5)
8+
System.Runtime.CompilerServices.Unsafe (>= 6.0)
69
Microsoft.NETCore.App.Ref (8.0)
10+
System.Memory (4.6)
11+
System.Runtime.CompilerServices.Unsafe (6.1)

0 commit comments

Comments
 (0)