diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets
index fecbd7e3f8..f84efcaab6 100644
--- a/.paket/Paket.Restore.targets
+++ b/.paket/Paket.Restore.targets
@@ -5,6 +5,9 @@
true
$(MSBuildThisFileDirectory)
+ $(MSBuildThisFileDirectory)..\
+ $(PaketRootPath)paket-files\paket.restore.cached
+ $(PaketRootPath)paket.lock
/Library/Frameworks/Mono.framework/Commands/mono
mono
@@ -16,29 +19,74 @@
$(PaketToolsPath)paket.bootstrapper.exe
"$(PaketBootStrapperExePath)"
$(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)"
-
+
true
- true
+ true
-
-
-
+
+
+ true
+
+
+
+ $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))
+ $([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))
+ true
+ false
+ true
+
+
+
+
+
+
- $(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references
+ $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached
+
+ $(MSBuildProjectFullPath).paket.references
+
+ $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references
+
+ $(MSBuildProjectDirectory)\paket.references
+ $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).references
+ true
+ references-file-or-cache-not-found
-
+
+
+ $([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)'))
+ $([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)'))
+ references-file
+ false
+
+
+
+
+ true
+ target-framework
+
+
+
+
+
+
+
+
+
+
+
-
+
$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0])
$([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1])
@@ -80,7 +128,7 @@
- $(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).references
+ $(MSBuildProjectDirectory)/$(MSBuildProjectFile)
true
false
true
@@ -90,7 +138,7 @@
<_NuspecFiles Include="$(BaseIntermediateOutputPath)*.nuspec"/>
-
+
diff --git a/.paket/paket.targets b/.paket/paket.targets
index 2fb5f4d52b..4621967c2e 100644
--- a/.paket/paket.targets
+++ b/.paket/paket.targets
@@ -6,6 +6,8 @@
true
$(MSBuildThisFileDirectory)
$(MSBuildThisFileDirectory)..\
+ $(PaketRootPath)paket.lock
+ $(PaketRootPath)paket-files\paket.restore.cached
/Library/Frameworks/Mono.framework/Commands/mono
mono
@@ -48,11 +50,23 @@
RestorePackages; $(BuildDependsOn);
+
+ true
+
+
+
+ $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)'))
+ $([System.IO.File]::ReadAllText('$(PaketLockFilePath)'))
+ true
+ false
+ true
+
+
diff --git a/Paket.sln b/Paket.sln
index 2b7f9e5f73..bf02d55e30 100644
--- a/Paket.sln
+++ b/Paket.sln
@@ -110,6 +110,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{62D18A
EndProjectSection
EndProject
Global
+ GlobalSection(Performance) = preSolution
+ HasPerformanceSessions = true
+ EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 01437f2a76..8368a91585 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,3 +1,6 @@
+#### 5.92.0 - 26.08.2017
+* PERFORMANCE: Make restore faster - https://github.com/fsprojects/Paket/pull/2675
+
#### 5.91.0 - 26.08.2017
* BUGFIX: fix a bug in the runtime parser - https://github.com/fsprojects/Paket/pull/2665
* BUGFIX: Add props to correct Paket.Restore.targets - https://github.com/fsprojects/Paket/pull/2665
diff --git a/build.fsx b/build.fsx
index d5ed0e73fc..1259b40ecf 100644
--- a/build.fsx
+++ b/build.fsx
@@ -168,6 +168,9 @@ Target "Build" (fun _ ->
"SourceLinkCreate" , "true"
] "Rebuild"
|> ignore
+
+ // DogFood newly build paket.exe for the dotnet build
+ setEnvironVar "PaketExePath" (Path.GetFullPath (buildDir @@ "paket.exe"))
)
let assertExitCodeZero x =
@@ -183,11 +186,14 @@ let runCmdIn workDir exe =
let dotnet workDir = runCmdIn workDir "dotnet"
Target "DotnetRestoreTools" (fun _ ->
+ // DogFood newly build paket.exe for the dotnet restore for the tools.
+ setEnvironVar "PaketExePath" (Path.GetFullPath (buildDir @@ "paket.exe"))
DotNetCli.Restore (fun c ->
{ c with
Project = currentDirectory > "tools" > "tools.fsproj"
- ToolPath = dotnetExePath
+ ToolPath = dotnetExePath
})
+ setEnvironVar "PaketExePath" null
)
Target "DotnetRestore" (fun _ ->
@@ -230,6 +236,8 @@ Target "DotnetPackage" (fun _ ->
// Run the unit tests using test runner
Target "RunTests" (fun _ ->
+ // Stop bootstrapping in from here (tests should use whatever they want to test).
+ setEnvironVar "PaketExePath" null
!! testAssemblies
|> NUnit3 (fun p ->
{ p with
diff --git a/src/Paket.Core/Common/Constants.fs b/src/Paket.Core/Common/Constants.fs
index 013a9e8297..b80240eeac 100644
--- a/src/Paket.Core/Common/Constants.fs
+++ b/src/Paket.Core/Common/Constants.fs
@@ -14,6 +14,8 @@ let [] GithubReleaseDownloadUrl = "https://github.com/fsprojects/Paket
let [] LockFileName = "paket.lock"
/// 'paket.local'
let [] LocalFileName = "paket.local"
+/// 'paket.restore.sha512'
+let [] RestoreHashFile = "paket.restore.cached"
/// 'paket.dependencies'
let [] DependenciesFileName = "paket.dependencies"
/// '.paket'
diff --git a/src/Paket.Core/Common/Utils.fs b/src/Paket.Core/Common/Utils.fs
index 1ab75db7e6..0173763844 100644
--- a/src/Paket.Core/Common/Utils.fs
+++ b/src/Paket.Core/Common/Utils.fs
@@ -1071,6 +1071,14 @@ let removeComment (text:string) =
| p1, p2 -> stripComment (min p1 p2)
remove 0
+let getSha512Stream (stream:Stream) =
+ use hasher = System.Security.Cryptography.SHA512.Create() :> System.Security.Cryptography.HashAlgorithm
+ Convert.ToBase64String(hasher.ComputeHash(stream))
+
+let getSha512File (filePath:string) =
+ use stream = File.OpenRead(filePath)
+ getSha512Stream stream
+
// adapted from MiniRx
// http://minirx.codeplex.com/
[]
diff --git a/src/Paket.Core/Dependencies/NuGetCache.fs b/src/Paket.Core/Dependencies/NuGetCache.fs
index 255f72ace1..33dc6299e0 100644
--- a/src/Paket.Core/Dependencies/NuGetCache.fs
+++ b/src/Paket.Core/Dependencies/NuGetCache.fs
@@ -316,10 +316,7 @@ let rec ExtractPackageToUserFolder(fileName:string, packageName:PackageName, ver
let cachedHashFile = Path.Combine(Constants.NuGetCacheFolder,fi.Name + ".sha512")
if not <| File.Exists cachedHashFile then
- use stream = File.OpenRead(fileName)
- let packageSize = stream.Length
- use hasher = System.Security.Cryptography.SHA512.Create() :> System.Security.Cryptography.HashAlgorithm
- let packageHash = Convert.ToBase64String(hasher.ComputeHash(stream))
+ let packageHash = getSha512File fileName
File.WriteAllText(cachedHashFile,packageHash)
File.Copy(cachedHashFile,targetPackageFileName + ".sha512")
diff --git a/src/Paket.Core/Dependencies/PackageResolver.fs b/src/Paket.Core/Dependencies/PackageResolver.fs
index d39cdc1836..63c5add36a 100644
--- a/src/Paket.Core/Dependencies/PackageResolver.fs
+++ b/src/Paket.Core/Dependencies/PackageResolver.fs
@@ -1271,7 +1271,7 @@ let Resolve (getVersionsRaw, getPreferredVersionsRaw, getPackageDetailsRaw, grou
// Flag to ensure that we don't hide underlying exceptions in the finally block.
let mutable exceptionThrown = false
try
-#if DEBUG
+#if DEBUG && !DOTNETCORE
let mutable results = None
let mutable error = None
// Increase stack size, because we have no tail-call-elimination
diff --git a/src/Paket.Core/Installation/RestoreProcess.fs b/src/Paket.Core/Installation/RestoreProcess.fs
index f7b06f6bda..ecc5d661c6 100644
--- a/src/Paket.Core/Installation/RestoreProcess.fs
+++ b/src/Paket.Core/Installation/RestoreProcess.fs
@@ -260,71 +260,90 @@ let createPaketCLIToolsFile (cliTools:ResolvedPackage seq) (fileInfo:FileInfo) =
if verbose then
tracefn " - %s already up-to-date" fileInfo.FullName
-let createProjectReferencesFiles (dependenciesFile:DependenciesFile) (lockFile:LockFile) (projectFile:FileInfo) (referencesFile:ReferencesFile) (resolved:Lazy