diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj
index 74c5c5e2d05..978754b5ee5 100644
--- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj
@@ -19,4 +19,8 @@
+
+
+
+
diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs
index f7e2c9e0a29..2e4c8c1518a 100644
--- a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/VisualStudioComponentTests.cs
@@ -80,6 +80,23 @@ public void ItCreatesSafeComponentIds()
Assert.Contains(@"microsoft.net.sdk.blazorwebassembly.aot", componentSwr);
}
+ [Fact]
+ public void ItCreatesComponentsWhenWorkloadsDoNotIncludePacks()
+ {
+ WorkloadManifest manifest = Create("mauiWorkloadManifest.json");
+ WorkloadDefinition definition = manifest.Workloads.FirstOrDefault().Value;
+ VisualStudioComponent component = VisualStudioComponent.Create(null, manifest, definition, NoItems, NoItems, NoItems, NoItems);
+
+ string swixProjDirectory = RandomPath;
+ Directory.CreateDirectory(swixProjDirectory);
+ component.Generate(swixProjDirectory);
+
+ string componentSwr = File.ReadAllText(Path.Combine(swixProjDirectory, "component.swr"));
+
+ Assert.Contains(@"vs.dependency id=maui.mobile", componentSwr);
+ Assert.Contains(@"vs.dependency id=maui.desktop", componentSwr);
+ }
+
private static WorkloadManifest Create(string filename)
{
return WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(filename),
diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/mauiWorkloadManifest.json b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/mauiWorkloadManifest.json
new file mode 100644
index 00000000000..03e0b1a5285
--- /dev/null
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads.Tests/testassets/mauiWorkloadManifest.json
@@ -0,0 +1,12 @@
+{
+ "version": "6.0.100-preview.6.891",
+ "workloads": {
+ "maui": {
+ "description": ".NET MAUI SDK for all platforms",
+ "extends": [
+ "maui-mobile",
+ "maui-desktop"
+ ]
+ }
+ }
+}
diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs
index f55d7355f6a..6f34c971a29 100644
--- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/GenerateWorkloadMsis.cs
@@ -117,7 +117,7 @@ private IEnumerable GetWorkloadPacks()
Select(w => w.Value).
Where(wd => (wd.Platforms == null) || wd.Platforms.Any(p => p.StartsWith("win")));
- var packIds = workloads.SelectMany(w => w.Packs).Distinct();
+ var packIds = workloads.Where(w => w.Packs != null).SelectMany(w => w.Packs).Distinct();
return manifests.SelectMany(m => m.Packs.Values).
Where(p => packIds.Contains(p.Id)).
diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs
index 66cbae46436..574cbe373b1 100644
--- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/MsiTemplate/Directories.wxs
@@ -6,8 +6,10 @@
-
-
+
+
+
+
diff --git a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs
index ee7e9d6d39c..b6d523fb38e 100644
--- a/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs
+++ b/src/Microsoft.DotNet.Build.Tasks.Workloads/src/VisualStudioComponent.cs
@@ -254,14 +254,17 @@ public static VisualStudioComponent Create(TaskLoggingHelper log, WorkloadManife
}
}
- // Visual Studio is case-insensitive.
- IEnumerable packIds = workload.Packs.Where(p => !missingPackIds.Contains($"{p}", StringComparer.OrdinalIgnoreCase));
- log?.LogMessage(MessageImportance.Low, $"Packs: {string.Join(", ", packIds.Select(p=>$"{p}"))}");
-
- foreach (WorkloadPackId packId in packIds)
+ if (workload.Packs != null)
{
- log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} ");
- component.AddDependency(manifest.Packs[packId]);
+ // Visual Studio is case-insensitive.
+ IEnumerable packIds = workload.Packs.Where(p => !missingPackIds.Contains($"{p}", StringComparer.OrdinalIgnoreCase));
+ log?.LogMessage(MessageImportance.Low, $"Packs: {string.Join(", ", packIds.Select(p => $"{p}"))}");
+
+ foreach (WorkloadPackId packId in packIds)
+ {
+ log?.LogMessage(MessageImportance.Low, $"Adding component dependency for {packId} ");
+ component.AddDependency(manifest.Packs[packId]);
+ }
}
return component;