From eb32a40ea2e2cdb0d02b68361367f36906caf6ac Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 3 May 2016 09:08:57 -0700 Subject: [PATCH] Deduplicate libraries --- .../TestApp/.noautobuild | 1 + .../TestApp/Program.cs | 10 ++++++++++ .../TestApp/project.json | 11 +++++++++++ .../TestLibrary/.noautobuild | 1 + .../TestLibrary/Program.cs | 10 ++++++++++ .../TestLibrary/project.json | 10 ++++++++++ .../DuplicatedReferenceAssembly/global.json | 1 + .../ProjectContextBuilder.cs | 16 ++++++++++++++++ .../PackageDependencyProviderTests.cs | 14 ++++++++++++++ 9 files changed, 74 insertions(+) create mode 100644 TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/.noautobuild create mode 100644 TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/Program.cs create mode 100644 TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/project.json create mode 100644 TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/.noautobuild create mode 100644 TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/Program.cs create mode 100644 TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/project.json create mode 100644 TestAssets/TestProjects/DuplicatedReferenceAssembly/global.json diff --git a/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/.noautobuild b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/.noautobuild new file mode 100644 index 000000000..8f7edc4ac --- /dev/null +++ b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/.noautobuild @@ -0,0 +1 @@ +noautobuild \ No newline at end of file diff --git a/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/Program.cs b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/Program.cs new file mode 100644 index 000000000..ad47172f7 --- /dev/null +++ b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/Program.cs @@ -0,0 +1,10 @@ +namespace TestApp +{ + public class Program + { + public static int Main(string[] args) + { + return 0; + } + } +} \ No newline at end of file diff --git a/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/project.json b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/project.json new file mode 100644 index 000000000..a542006e0 --- /dev/null +++ b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestApp/project.json @@ -0,0 +1,11 @@ +{ + "version": "1.0.0", + "dependencies": { + "TestLibrary": "1.0.0", + "System.IO.Compression": "4.1.0-rc2-24027" + }, + "frameworks": { + "net461": { + } + } +} diff --git a/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/.noautobuild b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/.noautobuild new file mode 100644 index 000000000..8f7edc4ac --- /dev/null +++ b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/.noautobuild @@ -0,0 +1 @@ +noautobuild \ No newline at end of file diff --git a/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/Program.cs b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/Program.cs new file mode 100644 index 000000000..402c79df7 --- /dev/null +++ b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/Program.cs @@ -0,0 +1,10 @@ +namespace TestLibrary +{ + public class Program + { + public static int Main(string[] args) + { + return 0; + } + } +} \ No newline at end of file diff --git a/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/project.json b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/project.json new file mode 100644 index 000000000..eb5e24be6 --- /dev/null +++ b/TestAssets/TestProjects/DuplicatedReferenceAssembly/TestLibrary/project.json @@ -0,0 +1,10 @@ +{ + "version": "1.0.0", + "frameworks": { + "net461": { + "frameworkAssemblies": { + "System.IO.Compression": "" + } + } + } +} diff --git a/TestAssets/TestProjects/DuplicatedReferenceAssembly/global.json b/TestAssets/TestProjects/DuplicatedReferenceAssembly/global.json new file mode 100644 index 000000000..ffcd4415b --- /dev/null +++ b/TestAssets/TestProjects/DuplicatedReferenceAssembly/global.json @@ -0,0 +1 @@ +{ } diff --git a/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs b/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs index 91cd69a21..7f8291c7d 100644 --- a/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs +++ b/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs @@ -497,6 +497,22 @@ namespace Microsoft.DotNet.ProjectModel dependencyDescription.Parents.Add(library); } } + + // Deduplicate libraries with the same name + // Priority list is backwards so not found -1 would be last when sorting by descending + var priorities = new[] { LibraryType.Package, LibraryType.Project, LibraryType.ReferenceAssembly }; + var nameGroups = libraries.Keys.ToLookup(libraryKey => libraryKey.Name); + foreach (var nameGroup in nameGroups) + { + var librariesToRemove = nameGroup + .OrderByDescending(libraryKey => Array.IndexOf(priorities, libraryKey.LibraryType)) + .Skip(1); + + foreach (var library in librariesToRemove) + { + libraries.Remove(library); + } + } } private void ScanLibraries(LockFileTarget target, diff --git a/test/Microsoft.DotNet.ProjectModel.Tests/PackageDependencyProviderTests.cs b/test/Microsoft.DotNet.ProjectModel.Tests/PackageDependencyProviderTests.cs index 3286dd05e..07eb33918 100644 --- a/test/Microsoft.DotNet.ProjectModel.Tests/PackageDependencyProviderTests.cs +++ b/test/Microsoft.DotNet.ProjectModel.Tests/PackageDependencyProviderTests.cs @@ -6,6 +6,7 @@ using Microsoft.DotNet.Tools.Test.Utilities; using NuGet.Frameworks; using NuGet.Versioning; using Xunit; +using System.IO; namespace Microsoft.DotNet.ProjectModel.Tests { @@ -140,5 +141,18 @@ namespace Microsoft.DotNet.ProjectModel.Tests var diagnostics = context.LibraryManager.GetAllDiagnostics(); Assert.False(diagnostics.Any(d => d.ErrorCode == ErrorCodes.DOTNET1011)); } + + [Fact] + public void NoDuplicatesWithProjectAndReferenceAssemblyWithSameName() + { + var instance = TestAssetsManager.CreateTestInstance("DuplicatedReferenceAssembly") + .WithLockFiles(); + var context = new ProjectContextBuilder().WithProjectDirectory(Path.Combine(instance.TestRoot, "TestApp")) + .WithTargetFramework("net461") + .Build(); + + // Will fail with dupes if any + context.LibraryManager.GetLibraries().ToDictionary(l => l.Identity.Name); + } } }