diff --git a/src/Microsoft.DotNet.ProjectModel/Workspace.cs b/src/Microsoft.DotNet.ProjectModel/Workspace.cs index ffdb8efad..2cf402e2d 100644 --- a/src/Microsoft.DotNet.ProjectModel/Workspace.cs +++ b/src/Microsoft.DotNet.ProjectModel/Workspace.cs @@ -53,7 +53,7 @@ namespace Microsoft.DotNet.ProjectModel .FirstOrDefault(c => Equals(c.TargetFramework, framework) && string.IsNullOrEmpty(c.RuntimeIdentifier)); } - public ProjectContextCollection GetProjectContextCollection(string projectPath) + public ProjectContextCollection GetProjectContextCollection(string projectPath, bool clearCache) { var normalizedPath = ProjectPathHelper.NormalizeProjectDirectoryPath(projectPath); if (normalizedPath == null) @@ -61,12 +61,24 @@ namespace Microsoft.DotNet.ProjectModel return null; } + if (clearCache) + { + _projectContextsCache.Clear(); + _projectsCache.Clear(); + _lockFileCache.Clear(); + } + return _projectContextsCache.AddOrUpdate( normalizedPath, key => AddProjectContextEntry(key, null), (key, oldEntry) => AddProjectContextEntry(key, oldEntry)); } + public ProjectContextCollection GetProjectContextCollection(string projectPath) + { + return GetProjectContextCollection(projectPath, clearCache: false); + } + public Project GetProject(string projectDirectory) => GetProjectCore(projectDirectory)?.Model; private LockFile GetLockFile(string projectDirectory) diff --git a/src/dotnet/commands/dotnet-projectmodel-server/InternalModels/ProjectSnapshot.cs b/src/dotnet/commands/dotnet-projectmodel-server/InternalModels/ProjectSnapshot.cs index 0944a7e80..9b44f7652 100644 --- a/src/dotnet/commands/dotnet-projectmodel-server/InternalModels/ProjectSnapshot.cs +++ b/src/dotnet/commands/dotnet-projectmodel-server/InternalModels/ProjectSnapshot.cs @@ -19,9 +19,13 @@ namespace Microsoft.DotNet.ProjectModel.Server public ErrorMessage GlobalErrorMessage { get; set; } public Dictionary ProjectContexts { get; } = new Dictionary(); - public static ProjectSnapshot Create(string projectDirectory, string configuration, DesignTimeWorkspace workspaceContext, IReadOnlyList projectSearchPaths) + public static ProjectSnapshot Create(string projectDirectory, + string configuration, + DesignTimeWorkspace workspaceContext, + IReadOnlyList projectSearchPaths, + bool clearWorkspaceContextCache) { - var projectContextsCollection = workspaceContext.GetProjectContextCollection(projectDirectory); + var projectContextsCollection = workspaceContext.GetProjectContextCollection(projectDirectory, clearWorkspaceContextCache); if (!projectContextsCollection.ProjectContexts.Any()) { throw new InvalidOperationException($"Unable to find project.json in '{projectDirectory}'"); diff --git a/src/dotnet/commands/dotnet-projectmodel-server/ProjectManager.cs b/src/dotnet/commands/dotnet-projectmodel-server/ProjectManager.cs index d28651a89..ae344ef5a 100644 --- a/src/dotnet/commands/dotnet-projectmodel-server/ProjectManager.cs +++ b/src/dotnet/commands/dotnet-projectmodel-server/ProjectManager.cs @@ -25,7 +25,7 @@ namespace Microsoft.DotNet.ProjectModel.Server // triggers private readonly Trigger _appPath = new Trigger(); private readonly Trigger _configure = new Trigger(); - private readonly Trigger _refreshDependencies = new Trigger(); + private readonly Trigger _refreshDependencies = new Trigger(); private readonly Trigger _filesChanged = new Trigger(); private ProjectSnapshot _local = new ProjectSnapshot(); @@ -201,7 +201,14 @@ namespace Microsoft.DotNet.ProjectModel.Server break; case MessageTypes.RefreshDependencies: case MessageTypes.RestoreComplete: - _refreshDependencies.Value = 0; + if (message.Payload.HasValues) + { + _refreshDependencies.Value = message.Payload.Value("Reset"); + } + else + { + _refreshDependencies.Value = true; + } break; case MessageTypes.FilesChanged: _filesChanged.Value = 0; @@ -240,9 +247,15 @@ namespace Microsoft.DotNet.ProjectModel.Server _appPath.ClearAssigned(); _configure.ClearAssigned(); _filesChanged.ClearAssigned(); + + bool resetCache = _refreshDependencies.WasAssigned ? _refreshDependencies.Value : false; _refreshDependencies.ClearAssigned(); - newSnapshot = ProjectSnapshot.Create(_appPath.Value, _configure.Value, _workspaceContext, _remote.ProjectSearchPaths); + newSnapshot = ProjectSnapshot.Create(_appPath.Value, + _configure.Value, + _workspaceContext, + _remote.ProjectSearchPaths, + clearWorkspaceContextCache: resetCache); } if (newSnapshot == null)