From 2a58247b62bdea7c829ca643812faa7665f39a73 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sun, 14 Dec 2025 19:55:28 -0800 Subject: Warn when Properties metadata overrides ProjectReference expansions metadata Resolves 8967 --- .../UpdateProjectReferenceMetadata.cs | 21 ++++++++++++++- src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs | 31 +++++++++++++++++++++- .../PackageUsingExplicitProperties/Package.wxs | 15 +++++++++++ .../PackageUsingExplicitProperties.wixproj | 13 +++++++++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/Package.wxs create mode 100644 src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/PackageUsingExplicitProperties.wixproj (limited to 'src') diff --git a/src/wix/WixToolset.BuildTasks/UpdateProjectReferenceMetadata.cs b/src/wix/WixToolset.BuildTasks/UpdateProjectReferenceMetadata.cs index d391bdb9..238ab02d 100644 --- a/src/wix/WixToolset.BuildTasks/UpdateProjectReferenceMetadata.cs +++ b/src/wix/WixToolset.BuildTasks/UpdateProjectReferenceMetadata.cs @@ -364,7 +364,26 @@ namespace WixToolset.BuildTasks } } - return new ProjectReferenceFacade(projectReference, configurations, null, platforms, null, targetFrameworks, null, runtimeIdentifiersValue.Values, null, publishBaseDir); + // If the Properties metadata is specified MSBuild will not use TargetFramework inference and require explicit declaration of + // our expansions (Configurations, Platforms, TargetFrameworks, RuntimeIdentifiers). Rather that try to interoperate, we'll + // warn the user that we're disabling our expansion behavior. + var propertiesValue = projectReference.GetMetadata("Properties"); + + if (!String.IsNullOrWhiteSpace(propertiesValue) && (configurationsValue.HadValue || platformsValue.HadValue || targetFrameworksValue.HadValue || runtimeIdentifiersValue.HadValue)) + { + logger.LogWarning( + "ProjectReference '{0}' specifies 'Properties' metadata. " + + "That overrides ProjectReference expansion so the 'Configurations', 'Platforms', 'TargetFrameworks', and 'RuntimeIdentifiers' metadata was ignored. " + + "Instead, use the 'AdditionalProperties' metadata to pass properties to the referenced project without disabling ProjectReference expansion.", + projectReference.ItemSpec); + + // Return a facade that does not participate in expansion. + return new ProjectReferenceFacade(projectReference, Array.Empty(), null, Array.Empty(), null, Array.Empty(), null, Array.Empty(), null, publishBaseDir); + } + else + { + return new ProjectReferenceFacade(projectReference, configurations, null, platforms, null, targetFrameworks, null, runtimeIdentifiersValue.Values, null, publishBaseDir); + } } public string CalculatePublishDir() diff --git a/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs b/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs index 78166e00..408bab2f 100644 --- a/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs +++ b/src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs @@ -14,7 +14,6 @@ namespace WixToolsetTest.Sdk using WixInternal.MSTestSupport; using WixToolset.Data; using WixToolset.Data.Symbols; - using WixToolset.Data.WindowsInstaller.Rows; [TestClass] public class MsbuildFixture @@ -814,6 +813,36 @@ namespace WixToolsetTest.Sdk } } + [TestMethod] + [DataRow(BuildSystem.DotNetCoreSdk)] + [DataRow(BuildSystem.MSBuild)] + [DataRow(BuildSystem.MSBuild64)] + public void CanBuildUsingExplicitProperties(BuildSystem buildSystem) + { + var sourceFolder = TestData.Get(@"TestData", "MultiTargetingWixlib"); + + using (var fs = new TestDataFolderFileSystem()) + { + fs.Initialize(sourceFolder); + var baseFolder = Path.Combine(fs.BaseFolder, "PackageUsingExplicitProperties"); + var binFolder = Path.Combine(baseFolder, @"bin\"); + var filesFolder = Path.Combine(binFolder, "Release", @"PFiles\"); + var projectPath = Path.Combine(baseFolder, "PackageUsingExplicitProperties.wixproj"); + + var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, [ + "-Restore", + MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "WixMSBuildProps", MsbuildFixture.WixPropsPath) + ]); + result.AssertSuccess(); + + var warnings = result.Output.Where(line => line.Contains(": warning")).Select(line => ExtractWarningFromMessage(line, baseFolder)).Distinct().ToArray(); + WixAssert.CompareLineByLine( + [ + @": ProjectReference '..\TestExe\TestExe.csproj' specifies 'Properties' metadata. That overrides ProjectReference expansion so the 'Configurations', 'Platforms', 'TargetFrameworks', and 'RuntimeIdentifiers' metadata was ignored. Instead, use the 'AdditionalProperties' metadata to pass properties to the referenced project without disabling ProjectReference expansion.", + ], warnings); + } + } + [TestMethod] [DataRow(BuildSystem.DotNetCoreSdk)] [DataRow(BuildSystem.MSBuild)] diff --git a/src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/Package.wxs b/src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/Package.wxs new file mode 100644 index 00000000..a53c59a5 --- /dev/null +++ b/src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/Package.wxs @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/PackageUsingExplicitProperties.wixproj b/src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/PackageUsingExplicitProperties.wixproj new file mode 100644 index 00000000..8d3d9112 --- /dev/null +++ b/src/wix/test/WixToolsetTest.Sdk/TestData/MultiTargetingWixlib/PackageUsingExplicitProperties/PackageUsingExplicitProperties.wixproj @@ -0,0 +1,13 @@ + + + + + + + + TargetFramework=net8.0;RuntimeIdentifier=win-x64 + + + + + -- cgit v1.2.3-55-g6feb