diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs index fa3bb8e04..a510aa9fa 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs @@ -141,7 +141,7 @@ namespace Microsoft.DotNet.Cli.Utils try { - lockFile = LockFileReader.Read(lockFilePath); + lockFile = LockFileReader.Read(lockFilePath, designTime: false); } catch (FileFormatException ex) { diff --git a/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs b/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs index a0f7c0c0e..c1e13ee63 100644 --- a/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs +++ b/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs @@ -22,14 +22,13 @@ namespace Microsoft.DotNet.ProjectModel.Graph _msbuildTargetLibraries = msbuildProjectLibraries.ToDictionary(GetProjectLibraryKey, l => GetTargetsForLibrary(_lockFile, l)); } - public void PatchIfNecessary() + public void Patch() { var exportFilePath = GetExportFilePath(_lockFile.LockFilePath); - if (File.Exists(exportFilePath) && _msbuildTargetLibraries.Any()) { var exportFile = LockFileReader.ReadExportFile(exportFilePath); - PatchLockWithExport(exportFile); + PatchLockWithExport(exportFile); } else { diff --git a/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs b/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs index 84fea0ada..2fb514407 100644 --- a/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs +++ b/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs @@ -14,14 +14,14 @@ using NuGet.Versioning; namespace Microsoft.DotNet.ProjectModel.Graph { public static class LockFileReader - { - public static LockFile Read(string lockFilePath, bool patchWithExportFile = true) + { + public static LockFile Read(string lockFilePath, bool designTime) { using (var stream = ResilientFileStreamOpener.OpenFile(lockFilePath)) { try { - return Read(lockFilePath, stream, patchWithExportFile); + return Read(lockFilePath, stream, designTime); } catch (FileFormatException ex) { @@ -34,7 +34,7 @@ namespace Microsoft.DotNet.ProjectModel.Graph } } - public static LockFile Read(string lockFilePath, Stream stream, bool patchWithExportFile = true) + public static LockFile Read(string lockFilePath, Stream stream, bool designTime) { try { @@ -47,16 +47,11 @@ namespace Microsoft.DotNet.ProjectModel.Graph } var lockFile = ReadLockFile(lockFilePath, jobject); - - var patcher = new LockFilePatcher(lockFile); - - if (patchWithExportFile) + + if (!designTime) { - patcher.PatchIfNecessary(); - } - else - { - patcher.ThrowIfAnyMsbuildLibrariesPresent(); + var patcher = new LockFilePatcher(lockFile); + patcher.Patch(); } return lockFile; diff --git a/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs b/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs index 4548a0ad4..2399d1d92 100644 --- a/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs +++ b/src/Microsoft.DotNet.ProjectModel/ProjectContextBuilder.cs @@ -32,6 +32,8 @@ namespace Microsoft.DotNet.ProjectModel private string PackagesDirectory { get; set; } private string ReferenceAssembliesPath { get; set; } + + private bool IsDesignTime { get; set; } private Func ProjectResolver { get; set; } @@ -116,6 +118,12 @@ namespace Microsoft.DotNet.ProjectModel Settings = settings; return this; } + + public ProjectContextBuilder AsDesignTime() + { + IsDesignTime = true; + return this; + } public IEnumerable BuildAllTargets() { @@ -389,7 +397,12 @@ namespace Microsoft.DotNet.ProjectModel } } - private void ScanLibraries(LockFileTarget target, LockFileLookup lockFileLookup, Dictionary libraries, MSBuildDependencyProvider msbuildResolver, PackageDependencyProvider packageResolver, ProjectDependencyProvider projectResolver) + private void ScanLibraries(LockFileTarget target, + LockFileLookup lockFileLookup, + Dictionary libraries, + MSBuildDependencyProvider msbuildResolver, + PackageDependencyProvider packageResolver, + ProjectDependencyProvider projectResolver) { foreach (var library in target.Libraries) { @@ -404,7 +417,7 @@ namespace Microsoft.DotNet.ProjectModel { if (MSBuildDependencyProvider.IsMSBuildProjectLibrary(projectLibrary)) { - description = msbuildResolver.GetDescription(TargetFramework, projectLibrary, library); + description = msbuildResolver.GetDescription(TargetFramework, projectLibrary, library, IsDesignTime); type = LibraryType.MSBuildProject; } else @@ -483,7 +496,7 @@ namespace Microsoft.DotNet.ProjectModel { var projectLockJsonPath = Path.Combine(projectDir, LockFile.FileName); return File.Exists(projectLockJsonPath) ? - LockFileReader.Read(Path.Combine(projectDir, LockFile.FileName)) : + LockFileReader.Read(Path.Combine(projectDir, LockFile.FileName), designTime: false) : null; } diff --git a/src/Microsoft.DotNet.ProjectModel/Resolution/MSBuildDependencyProvider.cs b/src/Microsoft.DotNet.ProjectModel/Resolution/MSBuildDependencyProvider.cs index ea9bda755..216f56bb6 100644 --- a/src/Microsoft.DotNet.ProjectModel/Resolution/MSBuildDependencyProvider.cs +++ b/src/Microsoft.DotNet.ProjectModel/Resolution/MSBuildDependencyProvider.cs @@ -21,11 +21,17 @@ namespace Microsoft.DotNet.ProjectModel.Resolution _projectResolver = projectResolver; } - public MSBuildProjectDescription GetDescription(NuGetFramework targetFramework, LockFileProjectLibrary projectLibrary, LockFileTargetLibrary targetLibrary) + public MSBuildProjectDescription GetDescription(NuGetFramework targetFramework, + LockFileProjectLibrary projectLibrary, + LockFileTargetLibrary targetLibrary, + bool isDesignTime) { + // During design time fragment file could be missing. When fragment file is missing none of the + // assets can be found but it is acceptable during design time. var compatible = targetLibrary.FrameworkAssemblies.Any() || targetLibrary.CompileTimeAssemblies.Any() || - targetLibrary.RuntimeAssemblies.Any(); + targetLibrary.RuntimeAssemblies.Any() || + isDesignTime; var dependencies = new List(targetLibrary.Dependencies.Count + targetLibrary.FrameworkAssemblies.Count); PopulateDependencies(dependencies, targetLibrary, targetFramework); diff --git a/src/Microsoft.DotNet.ProjectModel/WorkspaceContext.cs b/src/Microsoft.DotNet.ProjectModel/WorkspaceContext.cs index f152a3795..66313b2a1 100644 --- a/src/Microsoft.DotNet.ProjectModel/WorkspaceContext.cs +++ b/src/Microsoft.DotNet.ProjectModel/WorkspaceContext.cs @@ -211,7 +211,7 @@ namespace Microsoft.DotNet.ProjectModel { try { - currentEntry.Model = LockFileReader.Read(currentEntry.FilePath, fs); + currentEntry.Model = LockFileReader.Read(currentEntry.FilePath, fs, designTime: true); currentEntry.UpdateLastWriteTimeUtc(); } catch (FileFormatException ex) @@ -257,7 +257,8 @@ namespace Microsoft.DotNet.ProjectModel .WithProjectResolver(path => GetProject(path).Model) .WithLockFileResolver(path => GetLockFile(path)) .WithProject(project) - .WithTargetFramework(framework.FrameworkName); + .WithTargetFramework(framework.FrameworkName) + .AsDesignTime(); currentEntry.ProjectContexts.Add(builder.Build()); } diff --git a/test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs b/test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs index 2688643ee..32360d5b2 100644 --- a/test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs +++ b/test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs @@ -21,7 +21,7 @@ namespace Microsoft.DotNet.ProjectModel.Tests public void TestExportFileIsParsed() { var lockFilePath = GetLockFilePath("valid"); - var lockFile = LockFileReader.Read(lockFilePath); + var lockFile = LockFileReader.Read(lockFilePath, designTime: false); var exportFile = lockFile.ExportFile; @@ -41,7 +41,7 @@ namespace Microsoft.DotNet.ProjectModel.Tests public void TestLockFileIsPatchedWithExportData() { var lockFilePath = GetLockFilePath("valid"); - var lockFile = LockFileReader.Read(lockFilePath); + var lockFile = LockFileReader.Read(lockFilePath, designTime: false); // check lock file structure is similar to export structure foreach (var target in lockFile.Targets) @@ -59,7 +59,7 @@ namespace Microsoft.DotNet.ProjectModel.Tests public void TestFragmentExistsButNoHolesInLockFile() { var lockFilePath = GetLockFilePath("valid_staleFragment"); - var lockFile = LockFileReader.Read(lockFilePath); + var lockFile = LockFileReader.Read(lockFilePath, designTime: false); var exportFile = lockFile.ExportFile; @@ -75,7 +75,7 @@ namespace Microsoft.DotNet.ProjectModel.Tests { var lockFilePath = GetLockFilePath("invalid_nofragment"); - Assert.Throws(() => LockFileReader.Read(lockFilePath)); + Assert.Throws(() => LockFileReader.Read(lockFilePath, designTime: false)); } [Fact] @@ -83,7 +83,7 @@ namespace Microsoft.DotNet.ProjectModel.Tests { var lockFilePath = GetLockFilePath("invalid_missing-exports"); - Assert.Throws(() => LockFileReader.Read(lockFilePath)); + Assert.Throws(() => LockFileReader.Read(lockFilePath, designTime: false)); } [Fact] @@ -91,7 +91,7 @@ namespace Microsoft.DotNet.ProjectModel.Tests { var lockFilePath = GetLockFilePath("invalid_missmatching-versions"); - Assert.Throws(() => LockFileReader.Read(lockFilePath)); + Assert.Throws(() => LockFileReader.Read(lockFilePath, designTime: false)); } private static int LibraryNumberFromName(Microsoft.DotNet.ProjectModel.Graph.LockFileTargetLibrary library)