Transform lock file reader exceptions into diagnostics

This commit is contained in:
Mihai Codoban 2016-03-30 14:51:43 -07:00
parent 9cc3d088f0
commit 54278c294e
2 changed files with 47 additions and 4 deletions

View file

@ -13,5 +13,8 @@ namespace Microsoft.DotNet.ProjectModel
// Multiple libraries marked as "platform" // Multiple libraries marked as "platform"
public static readonly string DOTNET1013 = nameof(DOTNET1013); public static readonly string DOTNET1013 = nameof(DOTNET1013);
// Failed to read lock file
public static readonly string DOTNET1014 = nameof(DOTNET1014);
} }
} }

View file

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using Microsoft.DotNet.ProjectModel.Graph; using Microsoft.DotNet.ProjectModel.Graph;
using Microsoft.DotNet.ProjectModel.Resolution; using Microsoft.DotNet.ProjectModel.Resolution;
using Microsoft.Extensions.Internal; using Microsoft.Extensions.Internal;
@ -138,6 +139,8 @@ namespace Microsoft.DotNet.ProjectModel
public ProjectContext Build() public ProjectContext Build()
{ {
var diagnostics = new List<DiagnosticMessage>();
ProjectDirectory = Project?.ProjectDirectory ?? ProjectDirectory; ProjectDirectory = Project?.ProjectDirectory ?? ProjectDirectory;
if (GlobalSettings == null && ProjectDirectory != null) if (GlobalSettings == null && ProjectDirectory != null)
@ -159,7 +162,7 @@ namespace Microsoft.DotNet.ProjectModel
LockFileLookup lockFileLookup = null; LockFileLookup lockFileLookup = null;
EnsureProjectLoaded(); EnsureProjectLoaded();
LockFile = LockFile ?? LockFileResolver(ProjectDirectory); ReadLockFile(diagnostics);
var validLockFile = true; var validLockFile = true;
string lockFileValidationMessage = null; string lockFileValidationMessage = null;
@ -193,7 +196,7 @@ namespace Microsoft.DotNet.ProjectModel
if (target != null) if (target != null)
{ {
var nugetPackageResolver = new PackageDependencyProvider(PackagesDirectory, frameworkReferenceResolver); var nugetPackageResolver = new PackageDependencyProvider(PackagesDirectory, frameworkReferenceResolver);
var msbuildProjectResolver = new MSBuildDependencyProvider(Project ,ProjectResolver); var msbuildProjectResolver = new MSBuildDependencyProvider(Project, ProjectResolver);
ScanLibraries(target, lockFileLookup, libraries, msbuildProjectResolver, nugetPackageResolver, projectResolver); ScanLibraries(target, lockFileLookup, libraries, msbuildProjectResolver, nugetPackageResolver, projectResolver);
} }
} }
@ -204,8 +207,6 @@ namespace Microsoft.DotNet.ProjectModel
// Resolve the dependencies // Resolve the dependencies
ResolveDependencies(libraries, referenceAssemblyDependencyResolver, out requiresFrameworkAssemblies); ResolveDependencies(libraries, referenceAssemblyDependencyResolver, out requiresFrameworkAssemblies);
var diagnostics = new List<DiagnosticMessage>();
// REVIEW: Should this be in NuGet (possibly stored in the lock file?) // REVIEW: Should this be in NuGet (possibly stored in the lock file?)
if (LockFile == null) if (LockFile == null)
{ {
@ -270,6 +271,45 @@ namespace Microsoft.DotNet.ProjectModel
LockFile); LockFile);
} }
private void ReadLockFile(ICollection<DiagnosticMessage> diagnostics)
{
try
{
LockFile = LockFile ?? LockFileResolver(ProjectDirectory);
}
catch (FileFormatException e)
{
var lockFilePath = "";
if (LockFile != null)
{
lockFilePath = LockFile.LockFilePath;
}
else if (Project != null)
{
lockFilePath = Path.Combine(Project.ProjectDirectory, LockFile.FileName);
}
diagnostics.Add(new DiagnosticMessage(
ErrorCodes.DOTNET1014,
ComposeMessageFromInnerExceptions(e),
lockFilePath,
DiagnosticMessageSeverity.Error));
}
}
private static string ComposeMessageFromInnerExceptions(Exception exception)
{
var sb = new StringBuilder();
while (exception != null)
{
sb.AppendLine(exception.Message);
exception = exception.InnerException;
}
return sb.ToString();
}
private void ResolveDependencies(Dictionary<LibraryKey, LibraryDescription> libraries, private void ResolveDependencies(Dictionary<LibraryKey, LibraryDescription> libraries,
ReferenceAssemblyDependencyResolver referenceAssemblyDependencyResolver, ReferenceAssemblyDependencyResolver referenceAssemblyDependencyResolver,
out bool requiresFrameworkAssemblies) out bool requiresFrameworkAssemblies)