Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/NuGet.BuildTasks.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Malinowski <jason.malinowski@microsoft.com>2016-02-11 04:41:26 +0300
committerJason Malinowski <jason.malinowski@microsoft.com>2016-02-11 04:41:26 +0300
commitb8552204ff93245bb6e36ff9a4cb6091d05a7b94 (patch)
tree6b930a491aefa905dfa9f817744a246e52ea4691
parent4d1d8fbbf0b0ee842fa05dc3d853d7bf4b47d0d3 (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.
-rw-r--r--src/Microsoft.NuGet.Build.Tasks.Tests/ProjectReferences/ProjectReferenceTests.cs1
-rw-r--r--src/Microsoft.NuGet.Build.Tasks.Tests/ReferenceResolutionTests.cs14
-rw-r--r--src/Microsoft.NuGet.Build.Tasks/Microsoft.NuGet.targets7
-rw-r--r--src/Microsoft.NuGet.Build.Tasks/NuGetPackageObject.cs4
-rw-r--r--src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs11
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);
}
}