diff options
author | Jason Malinowski <jason.malinowski@microsoft.com> | 2016-02-11 04:41:26 +0300 |
---|---|---|
committer | Jason Malinowski <jason.malinowski@microsoft.com> | 2016-02-11 04:41:26 +0300 |
commit | b8552204ff93245bb6e36ff9a4cb6091d05a7b94 (patch) | |
tree | 6b930a491aefa905dfa9f817744a246e52ea4691 | |
parent | 4d1d8fbbf0b0ee842fa05dc3d853d7bf4b47d0d3 (diff) |
Pass references from projects to ResolveAssemblyReferences.AssemblyFiles
If we pass a full path to ResolveAssemblyReferences.Assemblies, it will
remove the file and not pass it along to the compiler. This is bad
for project-to-project references, since the Visual Studio IDE still
needs to know about them to make sure everything is wired up correctly.
With this, we now pass project-to-project references to AssemblyFiles,
matching the behavior of the ResolveProjectReferences target.
There is a deeper question of whether or not we should pass all our
full paths along to AssemblyFiles, but that's something which requires
fairly extensive testing and might have back-compat problems that need
to be dealt with.
5 files changed, 33 insertions, 4 deletions
diff --git a/src/Microsoft.NuGet.Build.Tasks.Tests/ProjectReferences/ProjectReferenceTests.cs b/src/Microsoft.NuGet.Build.Tasks.Tests/ProjectReferences/ProjectReferenceTests.cs index 4b1aeb4..3460343 100644 --- a/src/Microsoft.NuGet.Build.Tasks.Tests/ProjectReferences/ProjectReferenceTests.cs +++ b/src/Microsoft.NuGet.Build.Tasks.Tests/ProjectReferences/ProjectReferenceTests.cs @@ -45,6 +45,7 @@ namespace Microsoft.NuGet.Build.Tasks.Tests.ProjectReferences Assert.Empty(result.Analyzers); AssertHelpers.PathEndsWith(@"XProjOutputDirectory\net452\XProjClassLib.dll", result.CopyLocalItems.Single().ItemSpec); AssertHelpers.PathEndsWith(@"XProjOutputDirectory\net452\XProjClassLib.dll", result.References.Single().ItemSpec); + Assert.All(result.References, r => Assert.Equal(ResolveNuGetPackageAssets.NuGetSourceType_Project, r.GetMetadata(ResolveNuGetPackageAssets.NuGetSourceType))); Assert.Empty(result.ReferencedPackages); } diff --git a/src/Microsoft.NuGet.Build.Tasks.Tests/ReferenceResolutionTests.cs b/src/Microsoft.NuGet.Build.Tasks.Tests/ReferenceResolutionTests.cs index 9119ca8..4bdaaa7 100644 --- a/src/Microsoft.NuGet.Build.Tasks.Tests/ReferenceResolutionTests.cs +++ b/src/Microsoft.NuGet.Build.Tasks.Tests/ReferenceResolutionTests.cs @@ -218,6 +218,20 @@ namespace Microsoft.NuGet.Build.Tasks.Tests } [Fact] + public static void AllPackageReferencesAreMarkedAsSuch() + { + var result = NuGetTestHelpers.ResolvePackagesWithJsonFileContents( + Json.Json.FluentAssertions, + targetMoniker: ".NETFramework,Version=v4.5.2", + runtimeIdentifier: "", + includeFrameworkReferences: true); + + // We should have references to the package itself plus framework packages + AssertHelpers.AssertCountOf(4, result.References); + Assert.All(result.References, r => Assert.Equal(ResolveNuGetPackageAssets.NuGetSourceType_Package, r.GetMetadata(ResolveNuGetPackageAssets.NuGetSourceType))); + } + + [Fact] public static void CopyLocalContentsIncludePdbsIfAvailable() { var result = NuGetTestHelpers.ResolvePackagesWithJsonFileContents( diff --git a/src/Microsoft.NuGet.Build.Tasks/Microsoft.NuGet.targets b/src/Microsoft.NuGet.Build.Tasks/Microsoft.NuGet.targets index 1526b82..42dbc16 100644 --- a/src/Microsoft.NuGet.Build.Tasks/Microsoft.NuGet.targets +++ b/src/Microsoft.NuGet.Build.Tasks/Microsoft.NuGet.targets @@ -164,8 +164,11 @@ Copyright (c) .NET Foundation. All rights reserved. <!-- Remove simple name references that are already implicitly added --> <_ReferencesFromNuGetPackages Remove="%(ReferencePath.FileName)" Condition="'%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandTargetFramework'" /> - <!-- Include NuGet references --> - <Reference Include="@(_ReferencesFromNuGetPackages)" /> + <!-- Include NuGet references in the proper groups. Project-to-project references must go in the + _ResolvedProjectReferencePaths group which matches the behavior of the ResolveProjectReferences + target. This ensures that even if the assembly is missing on disk, it still makes it to the compiler. --> + <Reference Include="@(_ReferencesFromNuGetPackages)" Condition="'%(_ReferencesFromNuGetPackages.NuGetSourceType)' != 'Project'" /> + <_ResolvedProjectReferencePaths Include="@(_ReferencesFromNuGetPackages)" Condition="'%(_ReferencesFromNuGetPackages.NuGetSourceType)' == 'Project'" /> <!-- Remove simple name references if we're directly providing a reference assembly to the compiler. For example, consider a project with an Reference Include="System", and some NuGet package is providing System.dll --> diff --git a/src/Microsoft.NuGet.Build.Tasks/NuGetPackageObject.cs b/src/Microsoft.NuGet.Build.Tasks/NuGetPackageObject.cs index 696db15..b6fb6fc 100644 --- a/src/Microsoft.NuGet.Build.Tasks/NuGetPackageObject.cs +++ b/src/Microsoft.NuGet.Build.Tasks/NuGetPackageObject.cs @@ -23,10 +23,11 @@ namespace Microsoft.NuGet.Build.Tasks /// </summary> private readonly Lazy<string> _fullPackagePath; - public NuGetPackageObject(string id, string version, Func<string> fullPackagePathGenerator, JObject targetObject, JObject libraryObject) + public NuGetPackageObject(string id, string version, bool isProject, Func<string> fullPackagePathGenerator, JObject targetObject, JObject libraryObject) { Id = id; Version = version; + IsProject = isProject; _fullPackagePath = new Lazy<string>(fullPackagePathGenerator); TargetObject = targetObject; LibraryObject = libraryObject; @@ -34,6 +35,7 @@ namespace Microsoft.NuGet.Build.Tasks public string Id { get; } public string Version { get; } + public bool IsProject { get; } /// <summary> /// The JSON object from the "targets" section in the project.lock.json for this package. diff --git a/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs b/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs index f336077..7fa59f7 100644 --- a/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs +++ b/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs @@ -22,6 +22,10 @@ namespace Microsoft.NuGet.Build.Tasks internal const string NuGetPackageIdMetadata = "NuGetPackageId"; internal const string NuGetPackageVersionMetadata = "NuGetPackageVersion"; internal const string NuGetIsFrameworkReference = "NuGetIsFrameworkReference"; + internal const string NuGetSourceType = "NuGetSourceType"; + internal const string NuGetSourceType_Project = "Project"; + internal const string NuGetSourceType_Package = "Package"; + internal const string ReferenceImplementationMetadata = "Implementation"; internal const string ReferenceImageRuntimeMetadata = "ImageRuntime"; internal const string ReferenceWinMDFileMetadata = "WinMDFile"; @@ -286,6 +290,7 @@ namespace Microsoft.NuGet.Build.Tasks { var item = new TaskItem(frameworkReference); item.SetMetadata(NuGetIsFrameworkReference, "true"); + item.SetMetadata(NuGetSourceType, NuGetSourceType_Package); _references.Add(item); } } @@ -775,6 +780,7 @@ namespace Microsoft.NuGet.Build.Tasks item.SetMetadata("Private", "false"); item.SetMetadata(NuGetIsFrameworkReference, "false"); + item.SetMetadata(NuGetSourceType, package.IsProject ? NuGetSourceType_Project : NuGetSourceType_Package); items.Add(item); @@ -873,6 +879,7 @@ namespace Microsoft.NuGet.Build.Tasks var nameParts = package.Key.Split('/'); var id = nameParts[0]; var version = nameParts[1]; + bool isProject = false; var libraryObject = (JObject)lockFile["libraries"][package.Key]; @@ -881,6 +888,8 @@ namespace Microsoft.NuGet.Build.Tasks // If this is a project then we need to figure out it's relative output path if ((string)libraryObject["type"] == "project") { + isProject = true; + fullPackagePathGenerator = () => { var relativeMSBuildProjectPath = (string)libraryObject["msbuildProject"]; @@ -905,7 +914,7 @@ namespace Microsoft.NuGet.Build.Tasks fullPackagePathGenerator = () => GetNuGetPackagePath(id, version); } - yield return new NuGetPackageObject(id, version, fullPackagePathGenerator, (JObject)package.Value, libraryObject); + yield return new NuGetPackageObject(id, version, isProject, fullPackagePathGenerator, (JObject)package.Value, libraryObject); } } |