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;