Skip to content

Commit 1688d82

Browse files
committed
Merge branch 'hotfix/8.1.1'
2 parents 9ced2aa + 85c4857 commit 1688d82

27 files changed

+189
-161
lines changed

CHANGELOG.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
66

77
## [vNext]
88

9+
## [8.1.1] / 2024-10-05
10+
- Fixed nested solution folders in `StronglyTypedSolutionGenerator`
11+
- Fixed whitespace arguments in `ArgumentStringHandler`
12+
- Fixed output logging in parallel execution
13+
- Fixed exclusion of invoked targets from skipping
14+
- Fixed definite argument in `EntityFrameworkTasks`
15+
916
## [8.1.0] / 2024-09-10
1017
- Added schema generation with references for `build.schema.json`
1118
- Added deserialization of full objects from `parameters.json`
@@ -1150,7 +1157,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
11501157
- Added CLT tasks for Git
11511158
- Fixed background color in console output
11521159

1153-
[vNext]: https://github.com/nuke-build/nuke/compare/8.1.0...HEAD
1160+
[vNext]: https://github.com/nuke-build/nuke/compare/8.1.1...HEAD
1161+
[8.1.1]: https://github.com/nuke-build/nuke/compare/8.1.0...8.1.1
11541162
[8.1.0]: https://github.com/nuke-build/nuke/compare/8.0.0...8.1.0
11551163
[8.0.0]: https://github.com/nuke-build/nuke/compare/7.0.6...8.0.0
11561164
[7.0.6]: https://github.com/nuke-build/nuke/compare/7.0.5...7.0.6

Directory.Packages.props

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.10.0" />
5757
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.10.0" />
5858
</ItemGroup>
59-
59+
6060
<!-- MSBuild (Nuke.ProjectModel + Nuke.MSBuildTasks) -->
6161
<ItemGroup>
6262
<PackageVersion Include="Microsoft.Build.Locator" Version="1.7.8" />
@@ -81,4 +81,4 @@
8181
<PackageVersion Update="Microsoft.Build.Utilities.Core" Version="16.9.0" />
8282
</ItemGroup>
8383

84-
</Project>
84+
</Project>

docs/02-fundamentals/05-targets.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ class Build : NukeBuild
207207
// highlight-start
208208
.OnlyWhenDynamic(() => Data.Any())
209209
// highlight-end
210-
.Execute(() => { });
210+
.Executes(() => { });
211211
}
212212
```
213213

@@ -229,7 +229,7 @@ class Build : NukeBuild
229229
.WhenSkipped(DependencyBehavior.Execute)
230230
// highlight-end
231231
.DependsOn(A)
232-
.Execute(() => { });
232+
.Executes(() => { });
233233
}
234234
```
235235

@@ -286,7 +286,7 @@ class Build : NukeBuild
286286

287287
Target B => _ => _
288288
.DependsOn(A)
289-
.Execute(() => { });
289+
.Executes(() => { });
290290
}
291291
```
292292

@@ -309,7 +309,7 @@ class Build : NukeBuild
309309
.AssuredAfterFailure()
310310
// highlight-end
311311
.DependsOn(A)
312-
.Execute(() => { });
312+
.Executes(() => { });
313313
}
314314
```
315315

docs/03-common/07-solution-project-model.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ With an instance of the `Solution` type you can **read and write the solution**
3434
```csharp
3535
// Gather projects
3636
var globalToolProject = Solution.GetProject("Nuke.GlobalTool");
37-
var testProjects = Solution.GetProjects("*.Tests");
37+
var testProjects = Solution.GetAllProjects("*.Tests");
3838

3939
// Gather all solution items
4040
var allItems = Solution.AllSolutionFolders.SelectMany(x => x.Items);

source/Nuke.Build.Tests/BuildExecutorTest.cs

+39-22
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,7 @@ public void TestDefault()
3636
}
3737

3838
[Fact]
39-
public void TestParameterSkipped_All()
40-
{
41-
ExecuteBuild(skippedTargets: new ExecutableTarget[0]);
42-
AssertSkipped(A, B, C);
43-
}
44-
45-
[Fact]
46-
public void TestParameterSkipped_Single()
39+
public void TestParameterSkipped()
4740
{
4841
ExecuteBuild(skippedTargets: new[] { A });
4942
AssertSucceeded(B, C);
@@ -52,9 +45,21 @@ public void TestParameterSkipped_Single()
5245
}
5346

5447
[Fact]
55-
public void TestParameterSkipped_Multiple()
48+
public void TestParameterSkipped_Default()
49+
{
50+
C.IsDefault = true;
51+
C.Invoked = false;
52+
53+
ExecuteBuild(skippedTargets: new ExecutableTarget[0]);
54+
AssertSkipped(A, B, C);
55+
}
56+
57+
[Fact]
58+
public void TestParameterSkipped_Invoked()
5659
{
57-
ExecuteBuild(skippedTargets: new[] { A, B });
60+
C.Invoked = true;
61+
62+
ExecuteBuild(skippedTargets: new ExecutableTarget[0]);
5863
AssertSucceeded(C);
5964
AssertSkipped(A, B);
6065
}
@@ -66,6 +71,7 @@ public void TestParameterSkipped_DependencyBehavior_Skip()
6671
ExecuteBuild(skippedTargets: new[] { B });
6772
AssertSucceeded(C);
6873
AssertSkipped(A, B);
74+
A.Skipped.Should().Be("because of B");
6975
}
7076

7177
[Fact]
@@ -109,6 +115,16 @@ public void TestStaticCondition_Multiple()
109115
A.OnlyWhen.Should().Be("A && B");
110116
}
111117

118+
[Fact]
119+
public void TestStaticCondition_Throwing()
120+
{
121+
A.StaticConditions.Add(("condition", () => throw new Exception()));
122+
var action = () => ExecuteBuild();
123+
124+
action.Should().Throw<TargetExecutionException>()
125+
.WithMessage("Target 'A' has thrown an exception.");
126+
}
127+
112128
[Fact]
113129
public void TestDynamicCondition_Unchanged()
114130
{
@@ -130,6 +146,16 @@ public void TestDynamicCondition_Changed()
130146
AssertSucceeded(A, B, C);
131147
}
132148

149+
[Fact]
150+
public void TestDynamicCondition_Throwing()
151+
{
152+
B.DynamicConditions.Add(("condition", () => throw new Exception()));
153+
var action = () => ExecuteBuild();
154+
155+
action.Should().Throw<TargetExecutionException>()
156+
.WithMessage("Target 'B' has thrown an exception.");
157+
}
158+
133159
[Fact]
134160
public void TestMixedConditions()
135161
{
@@ -140,22 +166,13 @@ public void TestMixedConditions()
140166
}
141167

142168
[Fact]
143-
public void TestThrowingCondition()
144-
{
145-
A.StaticConditions.Add(("condition", () => throw new Exception()));
146-
var action = () => ExecuteBuild();
147-
148-
action.Should().Throw<TargetExecutionException>();
149-
}
150-
151-
[Fact]
152-
public void TestSkipTriggers()
169+
public void TestTriggers_Skipped()
153170
{
171+
B.ExecutionDependencies.Clear();
172+
C.ExecutionDependencies.Clear();
154173
A.DynamicConditions.Add(("condition", () => false));
155174
A.Triggers.Add(B);
156175
B.Triggers.Add(C);
157-
B.ExecutionDependencies.Clear();
158-
C.ExecutionDependencies.Clear();
159176

160177
ExecuteBuild();
161178

source/Nuke.Build/Execution/BuildExecutor.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,11 @@ private static void MarkTargetSkipped(INukeBuild build, ExecutableTarget target,
184184
if (target.Status != ExecutionStatus.Scheduled)
185185
return;
186186

187-
target.Status = ExecutionStatus.Skipped;
188-
target.Skipped ??= reason;
187+
if (!target.Invoked)
188+
{
189+
target.Status = ExecutionStatus.Skipped;
190+
target.Skipped ??= reason;
191+
}
189192

190193
if (target.DependencyBehavior == DependencyBehavior.Execute)
191194
return;

source/Nuke.Build/Execution/BuildManager.cs

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public static int Execute<T>(Expression<Func<T, Target>>[] defaultTargetExpressi
6262
if (!build.NoLogo)
6363
build.WriteLogo();
6464

65+
// TODO: move InvokedTargets to ExecutableTargetFactory
6566
build.ExecutionPlan = ExecutionPlanner.GetExecutionPlan(
6667
build.ExecutableTargets,
6768
ParameterService.GetParameter<string[]>(() => build.InvokedTargets));

source/Nuke.Build/Execution/ExecutionPlanner.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,8 @@ public static IReadOnlyCollection<ExecutableTarget> GetExecutionPlan(
2121
IReadOnlyCollection<ExecutableTarget> executableTargets,
2222
[CanBeNull] IReadOnlyCollection<string> invokedTargetNames)
2323
{
24-
var invokedTargets = invokedTargetNames?.Select(x => GetExecutableTarget(x, executableTargets)).ToList() ??
25-
executableTargets.Where(x => x.IsDefault).ToList();
26-
invokedTargets.ForEach(x => x.Invoked = true);
24+
var invokedTargets = invokedTargetNames?.Select(x => GetExecutableTarget(x, executableTargets)).ToList();
25+
invokedTargets?.ForEach(x => x.Invoked = true);
2726

2827
// Repeat to create the plan with triggers taken into account until plan doesn't change
2928
IReadOnlyCollection<ExecutableTarget> executionPlan;
@@ -74,7 +73,8 @@ private static IReadOnlyCollection<ExecutableTarget> GetExecutionPlanInternal(
7473
graphAsList.Remove(independent);
7574

7675
var executableTarget = independent.Value;
77-
if (!invokedTargets.Contains(executableTarget) &&
76+
if (!(invokedTargets != null && invokedTargets.Contains(executableTarget)) &&
77+
!(invokedTargets == null && executableTarget.IsDefault) &&
7878
!scheduledTargets.SelectMany(x => x.ExecutionDependencies).Contains(executableTarget))
7979
continue;
8080

source/Nuke.Build/INukeBuild.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace Nuke.Common;
1717
[PublicAPI]
1818
public interface INukeBuild
1919
{
20-
void ReportSummary(Configure<IDictionary<string, string>> configurator = null);
20+
void ReportSummary(Configure<Dictionary<string, string>> configurator = null);
2121

2222
internal IReadOnlyCollection<ExecutableTarget> ExecutableTargets { get; }
2323
internal IReadOnlyCollection<IBuildExtension> BuildExtensions { get; }

source/Nuke.Build/NukeBuild.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -205,13 +205,13 @@ ExecutionStatus.Aborted or
205205

206206
private bool IsInterceptorExecution => Environment.GetEnvironmentVariable(InterceptorEnvironmentKey) == "1";
207207

208-
public void ReportSummary(Configure<IDictionary<string, string>> configurator = null)
208+
public void ReportSummary(Configure<Dictionary<string, string>> configurator = null)
209209
{
210210
var target = ExecutionPlan.Single(x => x.Status == ExecutionStatus.Running);
211211
ReportSummary(target, configurator);
212212
}
213213

214-
internal void ReportSummary(ExecutableTarget target, Configure<IDictionary<string, string>> configurator)
214+
internal void ReportSummary(ExecutableTarget target, Configure<Dictionary<string, string>> configurator)
215215
{
216216
target.SummaryInformation = configurator.InvokeSafe(new Dictionary<string, string>()).ToDictionary(x => x.Key, x => x.Value);
217217
ExecuteExtension<IOnTargetSummaryUpdated>(x => x.OnTargetSummaryUpdated(this, target));

source/Nuke.Build/Telemetry/Telemetry.Events.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public static void AddPackage()
7676
.AddDictionary(GetRepositoryProperties(EnvironmentInfo.WorkingDirectory)));
7777
}
7878

79-
private static void TrackEvent(string eventName, Func<IDictionary<string, string>> propertiesProvider)
79+
private static void TrackEvent(string eventName, Func<Dictionary<string, string>> propertiesProvider)
8080
{
8181
if (s_client == null)
8282
return;

source/Nuke.Build/Telemetry/Telemetry.Properties.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System;
66
using System.Collections.Generic;
7+
using System.Collections.ObjectModel;
78
using System.Linq;
89
using System.Reflection;
910
using System.Runtime.InteropServices;
@@ -20,7 +21,7 @@ internal partial class Telemetry
2021
{
2122
private static readonly string[] s_knownTargets = { "Restore", "Compile", "Test" };
2223

23-
private static IDictionary<string, string> GetCommonProperties(INukeBuild build = null)
24+
private static Dictionary<string, string> GetCommonProperties(INukeBuild build = null)
2425
{
2526
var version = ControlFlow.SuppressErrors(
2627
() =>
@@ -42,7 +43,7 @@ private static IDictionary<string, string> GetCommonProperties(INukeBuild build
4243
};
4344
}
4445

45-
private static IDictionary<string, string> GetRepositoryProperties(string directory)
46+
private static Dictionary<string, string> GetRepositoryProperties(string directory)
4647
{
4748
var repository = ControlFlow.SuppressErrors(() => GitRepository.FromLocalDirectory(directory), logWarning: false);
4849
if (repository == null)
@@ -76,7 +77,7 @@ private static IDictionary<string, string> GetRepositoryProperties(string direct
7677
};
7778
}
7879

79-
private static IDictionary<string, string> GetBuildProperties(INukeBuild build)
80+
private static ReadOnlyDictionary<string, string> GetBuildProperties(INukeBuild build)
8081
{
8182
var startTimeString = EnvironmentInfo.Variables.GetValueOrDefault(Constants.GlobalToolStartTimeEnvironmentKey);
8283
var compileTime = startTimeString != null
@@ -99,10 +100,10 @@ private static IDictionary<string, string> GetBuildProperties(INukeBuild build)
99100
.Select(GetTypeName).Distinct().OrderBy(x => x).JoinCommaSpace(),
100101
["build_components"] = build.GetType().GetInterfaces().Where(x => IsCommonType(x) && x != typeof(INukeBuild))
101102
.Select(GetTypeName).Distinct().OrderBy(x => x).JoinCommaSpace()
102-
};
103+
}.AsReadOnly();
103104
}
104105

105-
private static IDictionary<string, string> GetTargetProperties(INukeBuild build, ExecutableTarget target)
106+
private static Dictionary<string, string> GetTargetProperties(INukeBuild build, ExecutableTarget target)
106107
{
107108
return new Dictionary<string, string>
108109
{
@@ -113,7 +114,7 @@ private static IDictionary<string, string> GetTargetProperties(INukeBuild build,
113114
};
114115
}
115116

116-
private static IDictionary<string, string> GetGeneratorProperties(Type hostType, string generatorId)
117+
private static Dictionary<string, string> GetGeneratorProperties(Type hostType, string generatorId)
117118
{
118119
return new Dictionary<string, string>
119120
{

source/Nuke.Common/CI/AzurePipelines/AzurePipelines.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ private string GetText(AzurePipelinesIssueType type)
231231
public void WriteCommand(
232232
string command,
233233
string message = null,
234-
Func<IDictionary<string, object>, IDictionary<string, object>> dictionaryConfigurator = null)
234+
Func<Dictionary<string, object>, Dictionary<string, object>> dictionaryConfigurator = null)
235235
{
236236
var escapedTokens =
237237
dictionaryConfigurator?

source/Nuke.Common/CI/GitHubActions/GitHubActions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public void WriteError(string message)
149149
public void WriteCommand(
150150
string command,
151151
string message = null,
152-
Configure<IDictionary<string, object>> dictionaryConfigurator = null)
152+
Configure<Dictionary<string, object>> dictionaryConfigurator = null)
153153
{
154154
var parameters = dictionaryConfigurator.InvokeSafe(new Dictionary<string, object>())
155155
.Select(x => $"{x.Key}={EscapeProperty(x.Value.ToString())}")

source/Nuke.Common/CI/TeamCity/TeamCity.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public void WriteError(string text, string errorDetails = null)
281281
.AddPairWhenValueNotNull("errorDetails", errorDetails));
282282
}
283283

284-
public void Write(string command, Func<IDictionary<string, object>, IDictionary<string, object>> dictionaryConfigurator)
284+
public void Write(string command, Func<Dictionary<string, object>, Dictionary<string, object>> dictionaryConfigurator)
285285
{
286286
Write(new[] { command }.Concat(dictionaryConfigurator(new Dictionary<string, object>())
287287
.Select(x => $"{x.Key}='{Escape(x.Value.ToString())}'")

source/Nuke.Common/Tools/Docker/DockerTargetDefinitionExtensions.cs

+2-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
using System;
66
using System.Collections.Generic;
7-
using System.Collections.Immutable;
87
using System.IO;
98
using System.Linq;
109
using JetBrains.Annotations;
@@ -142,7 +141,7 @@ bool IsUpToDate() => build.BuildAssemblyDirectory.GlobFiles("*.dll")
142141
return definition;
143142
}
144143

145-
private static IReadOnlyDictionary<string, string> GetEnvironmentVariables(
144+
private static Dictionary<string, string> GetEnvironmentVariables(
146145
ToolSettings settings,
147146
AbsolutePath rootDirectory,
148147
AbsolutePath tempDirectory)
@@ -184,7 +183,6 @@ private static IReadOnlyDictionary<string, string> GetEnvironmentVariables(
184183
!x.Key.Contains(' ') &&
185184
!x.Key.EqualsAnyOrdinalIgnoreCase(excludedEnvironmentVariables) &&
186185
!x.Value.Contains(EnvironmentInfo.NewLine))
187-
.ToDictionary(x => x.Key, _ => default(string)).AsReadOnly())
188-
.ToImmutableSortedDictionary();
186+
.ToDictionary(x => x.Key, _ => default(string)));
189187
}
190188
}

0 commit comments

Comments
 (0)