From 12383a6f838b05dbea486edd6448e251f8520a49 Mon Sep 17 00:00:00 2001 From: Rafael Dowling Goodman Date: Tue, 25 Apr 2023 13:46:17 -0400 Subject: [PATCH] [GenerateEmbeddedResourcesManifest] handle Items with empty LogicalName #29306 A LogicalName isn't assigned to Resx resources. See https://github.com/dotnet/msbuild/blob/6300d22b25cc1bcb634663bd7087e31d8312bb15/src/Tasks/CreateManifestResourceName.cs#L231-L238 As a result, GenerateEmbeddedResourcesManifest needs to handle this possibility...otherwise it'll generate an invalid Microsoft.Extensions.FileProviders.Embedded.Manifest.xml with empty name attribute for File elements and empty ResourcePath elements. --- .../src/GenerateEmbeddedResourcesManifest.cs | 6 ++--- .../GenerateEmbeddedResourcesManifestTest.cs | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/FileProviders/Manifest.MSBuildTask/src/GenerateEmbeddedResourcesManifest.cs b/src/FileProviders/Manifest.MSBuildTask/src/GenerateEmbeddedResourcesManifest.cs index 1a236768dd8c..3bf87bf59ef2 100644 --- a/src/FileProviders/Manifest.MSBuildTask/src/GenerateEmbeddedResourcesManifest.cs +++ b/src/FileProviders/Manifest.MSBuildTask/src/GenerateEmbeddedResourcesManifest.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; @@ -90,11 +90,11 @@ public Manifest BuildManifest(EmbeddedItem[] processedItems) return manifest; } - private static string GetManifestPath(ITaskItem taskItem) => string.Equals(taskItem.GetMetadata(LogicalName), taskItem.GetMetadata(ManifestResourceName)) ? + private static string GetManifestPath(ITaskItem taskItem) => string.IsNullOrEmpty(taskItem.GetMetadata(LogicalName)) || string.Equals(taskItem.GetMetadata(LogicalName), taskItem.GetMetadata(ManifestResourceName)) ? taskItem.GetMetadata(TargetPath) : NormalizePath(taskItem.GetMetadata(LogicalName)); - private static string GetAssemblyResourceName(ITaskItem taskItem) => string.Equals(taskItem.GetMetadata(LogicalName), taskItem.GetMetadata(ManifestResourceName)) ? + private static string GetAssemblyResourceName(ITaskItem taskItem) => string.IsNullOrEmpty(taskItem.GetMetadata(LogicalName)) || string.Equals(taskItem.GetMetadata(LogicalName), taskItem.GetMetadata(ManifestResourceName)) ? taskItem.GetMetadata(ManifestResourceName) : taskItem.GetMetadata(LogicalName); diff --git a/src/FileProviders/Manifest.MSBuildTask/test/GenerateEmbeddedResourcesManifestTest.cs b/src/FileProviders/Manifest.MSBuildTask/test/GenerateEmbeddedResourcesManifestTest.cs index 62d1fb3e6127..eaa3d2f0cb18 100644 --- a/src/FileProviders/Manifest.MSBuildTask/test/GenerateEmbeddedResourcesManifestTest.cs +++ b/src/FileProviders/Manifest.MSBuildTask/test/GenerateEmbeddedResourcesManifestTest.cs @@ -59,6 +59,28 @@ public void CreateEmbeddedItems_MapsMetadataFromEmbeddedResources_WithLogicalNam Assert.Equal(expectedItems, embeddedItems); } + [Fact] + public void CreateEmbeddedItems_MapsMetadataFromEmbeddedResources_WithEmptyLogicalName() + { + // Arrange + var task = new TestGenerateEmbeddedResourcesManifest(); + var embeddedFiles = CreateEmbeddedResource( + CreateMetadata("site.css"), + CreateMetadata(@"lib\js\jquery.validate.js", logicalName: string.Empty)); + + var expectedItems = new[] + { + CreateEmbeddedItem("site.css","site.css"), + CreateEmbeddedItem(@"lib\js\jquery.validate.js","lib.js.jquery.validate.js") + }; + + // Act + var embeddedItems = task.CreateEmbeddedItems(embeddedFiles); + + // Assert + Assert.Equal(expectedItems, embeddedItems); + } + [Fact] public void BuildManifest_CanCreatesManifest_ForTopLevelFiles() {