diff --git a/Sharpmake.UnitTests/PackageReferencesTest.cs b/Sharpmake.UnitTests/PackageReferencesTest.cs index 246f55561..357420983 100644 --- a/Sharpmake.UnitTests/PackageReferencesTest.cs +++ b/Sharpmake.UnitTests/PackageReferencesTest.cs @@ -1,6 +1,7 @@ // Copyright (c) Ubisoft. All Rights Reserved. // Licensed under the Apache 2.0 License. See LICENSE.md in the project root for license information. +using System; using System.Linq; using NUnit.Framework; @@ -61,6 +62,27 @@ public void InheritedPrivatePackageReferencesToPublicBecomePublic() Assert.True(configuration.ReferencesByNuGetPackage.SortedValues.Any(item => item.PrivateAssets == PackageReferences.DefaultPrivateAssets && item.Name == "NUnit")); } } + + [Test] + public void PackageReferencesSupportConditions() + { + var project = GetProject(); + Assert.IsNotNull(project); + foreach (var configuration in project.Configurations) + { + Assert.AreEqual(2, configuration.ReferencesByNuGetPackage.Count); + CheckForPackageCondition("NUnit", "$(Configuration)='Release'"); + CheckForPackageCondition("NUnit-debug", "$(Configuration)='Debug'"); + + void CheckForPackageCondition(string packageName, string expectedCondition) + { + Assert.AreEqual( + configuration.ReferencesByNuGetPackage.SortedValues + .First(v => string.Equals(v.Name, packageName, StringComparison.Ordinal)).Condition, + expectedCondition); + } + } + } } namespace PackageReferencesTestProjects @@ -127,5 +149,16 @@ public override void ConfigureAll(Configuration conf, Target target) conf.ReferencesByNuGetPackage.Add("NUnit", "3.4.1"); } } + + [Generate] + public class ConditionalNuGetPackage : CSharpUnitTestCommonProject + { + [Configure()] + public virtual void ConfigureAll(Configuration conf, Target target) + { + conf.ReferencesByNuGetPackage.Add("NUnit", "3.4.1", condition: "$(Configuration)='Release'" ); + conf.ReferencesByNuGetPackage.Add("NUnit-debug", "3.4.1", condition: "$(Configuration)='Debug'" ); + } + } } } diff --git a/Sharpmake/PackageReferences.Template.cs b/Sharpmake/PackageReferences.Template.cs index 5a24e7e4a..72b760fea 100644 --- a/Sharpmake/PackageReferences.Template.cs +++ b/Sharpmake/PackageReferences.Template.cs @@ -8,7 +8,7 @@ public partial class PackageReferences /// /// See : https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#controlling-dependency-assets /// - private const string TemplateBeginPackageReference = " { - internal PackageReference(string name, string version, string dotNetHint, AssetsDependency privateAssets, string referenceType) + internal PackageReference(string name, string version, string dotNetHint, AssetsDependency privateAssets, string referenceType, string condition) { Name = name; Version = version; DotNetHint = dotNetHint; PrivateAssets = privateAssets; ReferenceType = referenceType; + Condition = condition; } internal PackageReference(string name, string version, string dotNetHint, AssetsDependency privateAssets) - : this(name, version, dotNetHint, privateAssets, null) + : this(name, version, dotNetHint, privateAssets, null, null) { } @@ -36,6 +37,7 @@ internal PackageReference(string name, string version, string dotNetHint, Assets public string Version { get; internal set; } public string DotNetHint { get; internal set; } public string ReferenceType { get; internal set; } + public string Condition { get; internal set; } public AssetsDependency PrivateAssets { get; internal set; } @@ -43,6 +45,7 @@ public string Resolve(Resolver resolver) { using (resolver.NewScopedParameter("packageName", Name)) using (resolver.NewScopedParameter("packageVersion", Version)) + using (resolver.NewScopedParameter("packageCondition", GetConditionParameter() )) { if (PrivateAssets == DefaultPrivateAssets) { @@ -60,6 +63,7 @@ public string Resolve(Resolver resolver, string customTemplate) { using (resolver.NewScopedParameter("packageName", Name)) using (resolver.NewScopedParameter("packageVersion", Version)) + using (resolver.NewScopedParameter("packageCondition", GetConditionParameter())) { return resolver.Resolve(customTemplate); } @@ -137,17 +141,22 @@ internal static IEnumerable GetFormatedAssetsDependency(AssetsDependency yield return "buildTransitive"; } } + + private string GetConditionParameter() + { + return string.IsNullOrWhiteSpace(Condition) ? string.Empty : $" Condition=\"{Condition}\""; + } } private readonly UniqueList _packageReferences = new UniqueList(); - public void Add(string packageName, string version, string dotNetHint = null, AssetsDependency privateAssets = DefaultPrivateAssets, string referenceType = null) + public void Add(string packageName, string version, string dotNetHint = null, AssetsDependency privateAssets = DefaultPrivateAssets, string referenceType = null, string condition = null) { // check package unicity var existingPackage = _packageReferences.FirstOrDefault(pr => pr.Name == packageName); if (existingPackage == null) { - _packageReferences.Add(new PackageReference(packageName, version, null, privateAssets, referenceType)); + _packageReferences.Add(new PackageReference(packageName, version, null, privateAssets, referenceType, condition )); return; } @@ -162,11 +171,18 @@ public void Add(string packageName, string version, string dotNetHint = null, As existingPackage.PrivateAssets &= privateAssets; Builder.Instance.LogWarningLine($"Package {packageName} was added twice with different private assets. Kept assets are {string.Join(",", PackageReference.GetFormatedAssetsDependency(existingPackage.PrivateAssets))}."); } + + if (!string.Equals(condition, existingPackage.Condition, StringComparison.Ordinal)) + { + existingPackage.Condition = condition; + Builder.Instance.LogWarningLine( + $"Package {packageName} was added twice with different conditions. Condition '{condition}' will be used."); + } } public void Add(string packageName, string version, string dotNetHint, AssetsDependency privateAssets) { - Add(packageName, version, dotNetHint, privateAssets, null); + Add(packageName, version, dotNetHint, privateAssets, null, null); } public int Count => _packageReferences.Count;