diff --git a/src/Cake.Common.Tests/Unit/Tools/DotNet/Restore/DotNetRestorerTests.cs b/src/Cake.Common.Tests/Unit/Tools/DotNet/Restore/DotNetRestorerTests.cs
index a86e6f1d9b..7f2d6052d5 100644
--- a/src/Cake.Common.Tests/Unit/Tools/DotNet/Restore/DotNetRestorerTests.cs
+++ b/src/Cake.Common.Tests/Unit/Tools/DotNet/Restore/DotNetRestorerTests.cs
@@ -102,6 +102,23 @@ public void Should_Quote_Root_Path(string text, string expected)
Assert.Equal(expected, result.Args);
}
+ [Fact]
+ public void Should_Resolve_Restore_Paths_Relative_To_WorkingDirectory()
+ {
+ // Given
+ var fixture = new DotNetRestorerFixture();
+ fixture.Settings.WorkingDirectory = "./source/MyProject";
+ fixture.Settings.PackagesDirectory = "./packages/";
+ fixture.Settings.ConfigFile = "./NuGet.config";
+ fixture.Settings.LockFilePath = "./obj/packages.lock.json";
+
+ // When
+ var result = fixture.Run();
+
+ // Then
+ Assert.Equal("restore --packages \"/Working/source/MyProject/packages\" --configfile \"/Working/source/MyProject/NuGet.config\" --lock-file-path \"/Working/source/MyProject/obj/packages.lock.json\"", result.Args);
+ }
+
[Fact]
public void Should_Add_Settings()
{
diff --git a/src/Cake.Common/Tools/DotNet/DotNetTool.cs b/src/Cake.Common/Tools/DotNet/DotNetTool.cs
index 5d473e01f3..50d9d8bb5a 100644
--- a/src/Cake.Common/Tools/DotNet/DotNetTool.cs
+++ b/src/Cake.Common/Tools/DotNet/DotNetTool.cs
@@ -127,5 +127,46 @@ private ProcessArgumentBuilder AppendCommonArguments(ProcessArgumentBuilder buil
return builder;
}
+ ///
+ /// Resolves a relative directory path against when set.
+ ///
+ protected static DirectoryPath GetAbsoluteDirectoryPath(DirectoryPath path, DotNetSettings settings, ICakeEnvironment environment)
+ {
+ ArgumentNullException.ThrowIfNull(path);
+ ArgumentNullException.ThrowIfNull(settings);
+ ArgumentNullException.ThrowIfNull(environment);
+
+ if (settings.WorkingDirectory != null && path.IsRelative)
+ {
+ return settings.WorkingDirectory.MakeAbsolute(environment).Combine(path);
+ }
+
+ return path;
+ }
+
+ ///
+ /// Resolves a relative file path against when set.
+ ///
+ protected static FilePath GetAbsoluteFilePath(FilePath path, DotNetSettings settings, ICakeEnvironment environment)
+ {
+ ArgumentNullException.ThrowIfNull(path);
+ ArgumentNullException.ThrowIfNull(settings);
+ ArgumentNullException.ThrowIfNull(environment);
+
+ if (settings.WorkingDirectory != null && path.IsRelative)
+ {
+ return settings.WorkingDirectory.MakeAbsolute(environment).CombineWithFilePath(path);
+ }
+
+ return path;
+ }
+
+ ///
+ /// Resolves a relative output directory against when set.
+ ///
+ protected static DirectoryPath GetAbsoluteOutputDirectory(DirectoryPath outputDirectory, DotNetSettings settings, ICakeEnvironment environment)
+ {
+ return GetAbsoluteDirectoryPath(outputDirectory, settings, environment);
+ }
}
}
diff --git a/src/Cake.Common/Tools/DotNet/Restore/DotNetRestorer.cs b/src/Cake.Common/Tools/DotNet/Restore/DotNetRestorer.cs
index 42b5ccb74e..c2cfc9004b 100644
--- a/src/Cake.Common/Tools/DotNet/Restore/DotNetRestorer.cs
+++ b/src/Cake.Common/Tools/DotNet/Restore/DotNetRestorer.cs
@@ -71,7 +71,8 @@ private ProcessArgumentBuilder GetArguments(string root, DotNetRestoreSettings s
if (settings.PackagesDirectory != null)
{
builder.Append("--packages");
- builder.AppendQuoted(settings.PackagesDirectory.MakeAbsolute(_environment).FullPath);
+ var packagesDirectory = GetAbsoluteDirectoryPath(settings.PackagesDirectory, settings, _environment);
+ builder.AppendQuoted(packagesDirectory.MakeAbsolute(_environment).FullPath);
}
// Sources
@@ -88,7 +89,8 @@ private ProcessArgumentBuilder GetArguments(string root, DotNetRestoreSettings s
if (settings.ConfigFile != null)
{
builder.Append("--configfile");
- builder.AppendQuoted(settings.ConfigFile.MakeAbsolute(_environment).FullPath);
+ var configFile = GetAbsoluteFilePath(settings.ConfigFile, settings, _environment);
+ builder.AppendQuoted(configFile.MakeAbsolute(_environment).FullPath);
}
// Ignore failed sources
@@ -142,7 +144,8 @@ private ProcessArgumentBuilder GetArguments(string root, DotNetRestoreSettings s
// Lock file path
if (settings.LockFilePath != null)
{
- builder.AppendSwitchQuoted("--lock-file-path", " ", settings.LockFilePath.MakeAbsolute(_environment).FullPath);
+ var lockFilePath = GetAbsoluteFilePath(settings.LockFilePath, settings, _environment);
+ builder.AppendSwitchQuoted("--lock-file-path", " ", lockFilePath.MakeAbsolute(_environment).FullPath);
}
// Force Evaluate