Skip to content

Commit

Permalink
Only resolve FrameworkReferences on correct target framework
Browse files Browse the repository at this point in the history
  • Loading branch information
dsplaisted committed Dec 10, 2018
1 parent 6e54f4a commit c6be6bc
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.Text;
using FluentAssertions;
using Xunit;

namespace Microsoft.NET.Build.Tasks.UnitTests
{
public class ResolveFrameworkReferencesTests
{
[Fact]
public void It_resolves_FrameworkReferences()
{
var task = new ResolveFrameworkReferences();

task.TargetFrameworkIdentifier = ".NETCoreApp";
task.TargetFrameworkVersion = "3.0";
task.FrameworkReferences = new[]
{
new MockTaskItem("Microsoft.AspNetCore.App", new Dictionary<string, string>())
};

task.KnownFrameworkReferences = new[]
{
new MockTaskItem("Microsoft.AspNetCore.App",
new Dictionary<string, string>()
{
{ "TargetFramework", "netcoreapp3.0" },
{ "RuntimeFrameworkName", "Microsoft.AspNetCore.App" },
{ "DefaultRuntimeFrameworkVersion", "1.9.5" },
{ "LatestRuntimeFrameworkVersion", "1.9.6" },
{ "TargetingPackName", "Microsoft.AspNetCore.App" },
{ "TargetingPackVersion", "1.9.0" }
})
};

task.Execute().Should().BeTrue();

task.PackageReferencesToAdd.Length.Should().Be(1);

task.RuntimeFrameworks.Length.Should().Be(1);
task.RuntimeFrameworks[0].ItemSpec.Should().Be("Microsoft.AspNetCore.App");
task.RuntimeFrameworks[0].GetMetadata(MetadataKeys.Version).Should().Be("1.9.5");

task.UnresolvedFrameworkReferences.Should().BeNull();
}

[Fact]
public void It_does_not_resolve_FrameworkReferences_if_targetframework_doesnt_match()
{
var task = new ResolveFrameworkReferences();

task.TargetFrameworkIdentifier = ".NETCoreApp";
task.TargetFrameworkVersion = "2.0";
task.FrameworkReferences = new[]
{
new MockTaskItem("Microsoft.AspNetCore.App", new Dictionary<string, string>())
};

task.KnownFrameworkReferences = new[]
{
new MockTaskItem("Microsoft.AspNetCore.App",
new Dictionary<string, string>()
{
{ "TargetFramework", "netcoreapp3.0" },
{ "RuntimeFrameworkName", "Microsoft.AspNetCore.App" },
{ "DefaultRuntimeFrameworkVersion", "1.9.5" },
{ "LatestRuntimeFrameworkVersion", "1.9.6" },
{ "TargetingPackName", "Microsoft.AspNetCore.App" },
{ "TargetingPackVersion", "1.9.0" }
})
};

task.Execute().Should().BeTrue();

task.PackageReferencesToAdd.Should().BeNull();
task.RuntimeFrameworks.Should().BeNull();

task.UnresolvedFrameworkReferences.Length.Should().Be(1);

}
}
}
28 changes: 28 additions & 0 deletions src/Tasks/Microsoft.NET.Build.Tasks/ResolveFrameworkReferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Text;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using NuGet.Frameworks;

namespace Microsoft.NET.Build.Tasks
{
Expand All @@ -14,6 +15,10 @@ namespace Microsoft.NET.Build.Tasks
/// </summary>
public class ResolveFrameworkReferences : TaskBase
{
public string TargetFrameworkIdentifier { get; set; }

public string TargetFrameworkVersion { get; set; }

public ITaskItem[] FrameworkReferences { get; set; } = Array.Empty<ITaskItem>();

public ITaskItem[] KnownFrameworkReferences { get; set; } = Array.Empty<ITaskItem>();
Expand All @@ -30,6 +35,8 @@ public class ResolveFrameworkReferences : TaskBase
protected override void ExecuteCore()
{
var knownFrameworkReferences = KnownFrameworkReferences.Select(item => new KnownFrameworkReference(item))
.Where(kfr => kfr.TargetFramework.Framework.Equals(TargetFrameworkIdentifier, StringComparison.OrdinalIgnoreCase) &&
NormalizeVersion(kfr.TargetFramework.Version) == NormalizeVersion(new Version(TargetFrameworkVersion)))
.ToDictionary(kfr => kfr.Name);

List<ITaskItem> packageReferencesToAdd = new List<ITaskItem>();
Expand Down Expand Up @@ -78,6 +85,24 @@ protected override void ExecuteCore()
{
UnresolvedFrameworkReferences = unresolvedFrameworkReferences.ToArray();
}

}

static Version NormalizeVersion(Version version)
{
if (version.Revision == 0)
{
if (version.Build == 0)
{
return new Version(version.Major, version.Minor);
}
else
{
return new Version(version.Major, version.Minor, version.Build);
}
}

return version;
}

class KnownFrameworkReference
Expand All @@ -86,6 +111,7 @@ class KnownFrameworkReference
public KnownFrameworkReference(ITaskItem item)
{
_item = item;
TargetFramework = NuGetFramework.Parse(item.GetMetadata("TargetFramework"));
}

// The name / itemspec of the FrameworkReference used in the project
Expand All @@ -99,6 +125,8 @@ public KnownFrameworkReference(ITaskItem item)
// The ID of the targeting pack NuGet package to reference
public string TargetingPackName => _item.GetMetadata("TargetingPackName");
public string TargetingPackVersion => _item.GetMetadata("TargetingPackVersion");

public NuGetFramework TargetFramework { get; }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,9 @@ Copyright (c) .NET Foundation. All rights reserved.
</ItemGroup>

<ResolveFrameworkReferences FrameworkReferences="@(FrameworkReference)"
KnownFrameworkReferences="@(KnownFrameworkReference)">
KnownFrameworkReferences="@(KnownFrameworkReference)"
TargetFrameworkIdentifier="$(TargetFrameworkIdentifier)"
TargetFrameworkVersion="$(_TargetFrameworkVersionWithoutV)">
<Output TaskParameter="PackageReferencesToAdd" ItemName="PackageReferenceToAdd" />
<Output TaskParameter="RuntimeFrameworks" ItemName="RuntimeFramework" />
<Output TaskParameter="UnresolvedFrameworkReferences" ItemName="_UnresolvedFrameworkReference" />
Expand Down
65 changes: 49 additions & 16 deletions src/Tests/Microsoft.NET.Build.Tests/GivenFrameworkReferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public static void Main(string [] args)
// to the project for test purposes
itemGroup.Add(new XElement(ns + "KnownFrameworkReference",
new XAttribute("Include", "HumanizerFramework"),
new XAttribute("TargetFramework", testProject.TargetFrameworks),
new XAttribute("RuntimeFrameworkName", "Humanizer.App"),
new XAttribute("DefaultRuntimeFrameworkVersion", "2.0.0"),
new XAttribute("LatestRuntimeFrameworkVersion", "3.0.0"),
Expand Down Expand Up @@ -133,6 +134,7 @@ public static void Main(string [] args)
// to the project for test purposes
itemGroup.Add(new XElement(ns + "KnownFrameworkReference",
new XAttribute("Include", "HumanizerFramework"),
new XAttribute("TargetFramework", testProject.TargetFrameworks),
new XAttribute("RuntimeFrameworkName", "Humanizer.App"),
new XAttribute("DefaultRuntimeFrameworkVersion", "2.0.0"),
new XAttribute("LatestRuntimeFrameworkVersion", "3.0.0"),
Expand All @@ -142,6 +144,7 @@ public static void Main(string [] args)

itemGroup.Add(new XElement(ns + "KnownFrameworkReference",
new XAttribute("Include", "NodaTimeFramework"),
new XAttribute("TargetFramework", testProject.TargetFrameworks),
new XAttribute("RuntimeFrameworkName", "NodaTime.App"),
new XAttribute("DefaultRuntimeFrameworkVersion", "1.0.0"),
new XAttribute("LatestRuntimeFrameworkVersion", "1.5.0"),
Expand Down Expand Up @@ -186,26 +189,11 @@ public void The_build_fails_when_there_is_an_unknown_FrameworkReference()
var testProject = new TestProject()
{
Name = "UnknownFrameworkReferenceTest",
TargetFrameworks = "netcoreapp2.0",
TargetFrameworks = "netcoreapp3.0",
IsSdkProject = true,
IsExe = true
};

testProject.SourceFiles.Add("Program.cs", @"
using System;
using Humanizer;
namespace FrameworkReferenceTest
{
public class Program
{
public static void Main(string [] args)
{
Console.WriteLine(""HelloWorld"".Humanize());
}
}
}");

var testAsset = _testAssetsManager.CreateTestProject(testProject)
.WithProjectChanges(project =>
{
Expand Down Expand Up @@ -233,5 +221,50 @@ public static void Main(string [] args)
.And.HaveStdOutContaining("AnotherUnknownFramework")
;
}

[Theory]
[InlineData("netcoreapp2.1", false)]
[InlineData("netcoreapp3.0", true)]
public void KnownFrameworkReferencesOnlyApplyToCorrectTargetFramework(string targetFramework, bool shouldPass)
{
var testProject = new TestProject()
{
Name = "FrameworkReferenceTest",
TargetFrameworks = targetFramework,
IsSdkProject = true,
IsExe = true
};

var testAsset = _testAssetsManager.CreateTestProject(testProject, identifier: targetFramework)
.WithProjectChanges(project =>
{
var ns = project.Root.Name.Namespace;

var itemGroup = new XElement(ns + "ItemGroup");
project.Root.Add(itemGroup);

itemGroup.Add(new XElement(ns + "FrameworkReference",
new XAttribute("Include", "Microsoft.AspNetCore.App")));
})
.Restore(Log, testProject.Name);

var buildCommand = new BuildCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name));

var result = buildCommand.Execute();

if (shouldPass)
{
result.Should().Pass();
}
else
{
result
.Should()
.Fail()
.And.HaveStdOutContaining("NETSDK1073")
.And.HaveStdOutContaining("Microsoft.AspNetCore.App");
}

}
}
}

0 comments on commit c6be6bc

Please sign in to comment.