From d108d1e09c8c84fab3e341fa39a09c831fd23153 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 00:15:03 +0100 Subject: [PATCH 01/53] Show summary when cancelling in console --- source/Nuke.Common/Execution/BuildExecutor.cs | 18 +++++++++++++++++- .../Nuke.Common/Execution/ExecutionStatus.cs | 3 ++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/source/Nuke.Common/Execution/BuildExecutor.cs b/source/Nuke.Common/Execution/BuildExecutor.cs index 48d843d87..42e55c746 100644 --- a/source/Nuke.Common/Execution/BuildExecutor.cs +++ b/source/Nuke.Common/Execution/BuildExecutor.cs @@ -36,6 +36,8 @@ public static int Execute(Expression> defaultTargetExpression CheckActiveBuildProjectConfigurations(); AttachVisualStudioDebugger(); + Console.CancelKeyPress += (s, e) => Finish(); + try { build.OnBuildCreated(); @@ -66,6 +68,11 @@ public static int Execute(Expression> defaultTargetExpression return -1; } finally + { + Finish(); + } + + void Finish() { if (Logger.OutputSink is SevereMessagesOutputSink outputSink) { @@ -73,11 +80,13 @@ public static int Execute(Expression> defaultTargetExpression WriteWarningsAndErrors(outputSink); } + // ReSharper disable AccessToModifiedClosure if (executionList != null) { Logger.Log(); WriteSummary(executionList); } + // ReSharper restore AccessToModifiedClosure build.OnBuildFinished(); } @@ -189,6 +198,7 @@ string[] GetExecutedTargets() using (Logger.Block(target.Name)) { + target.Status = ExecutionStatus.Aborted; build.OnTargetStart(target.Name); var stopwatch = Stopwatch.StartNew(); @@ -282,6 +292,7 @@ string ToMinutesAndSeconds(TimeSpan duration) case ExecutionStatus.Executed: Logger.Success(line); break; + case ExecutionStatus.Aborted: case ExecutionStatus.NotRun: case ExecutionStatus.Failed: Logger.Error(line); @@ -293,7 +304,12 @@ string ToMinutesAndSeconds(TimeSpan duration) Logger.Log(CreateLine("Total", "", ToMinutesAndSeconds(totalDuration))); Logger.Log(new string(c: '=', count: allColumns)); Logger.Log(); - if (executionList.All(x => x.Status != ExecutionStatus.Failed && x.Status != ExecutionStatus.NotRun)) + + var buildSucceeded = executionList + .All(x => x.Status != ExecutionStatus.Failed && + x.Status != ExecutionStatus.NotRun && + x.Status != ExecutionStatus.Aborted); + if (buildSucceeded) Logger.Success($"Build succeeded on {DateTime.Now.ToString(CultureInfo.CurrentCulture)}."); else Logger.Error($"Build failed on {DateTime.Now.ToString(CultureInfo.CurrentCulture)}."); diff --git a/source/Nuke.Common/Execution/ExecutionStatus.cs b/source/Nuke.Common/Execution/ExecutionStatus.cs index 8f47408aa..4be72c884 100644 --- a/source/Nuke.Common/Execution/ExecutionStatus.cs +++ b/source/Nuke.Common/Execution/ExecutionStatus.cs @@ -13,6 +13,7 @@ public enum ExecutionStatus Skipped, Executed, Failed, - Absent + Absent, + Aborted } } From 2a79bf7a76313b04e579b2cc8506ef5ae68829a7 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 00:15:28 +0100 Subject: [PATCH 02/53] Fix GitRepositoryExtensions.IsOnDevelopBranch --- source/Nuke.Common/Git/GitRepositoryExtensions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Nuke.Common/Git/GitRepositoryExtensions.cs b/source/Nuke.Common/Git/GitRepositoryExtensions.cs index ffba3f27c..414269817 100644 --- a/source/Nuke.Common/Git/GitRepositoryExtensions.cs +++ b/source/Nuke.Common/Git/GitRepositoryExtensions.cs @@ -28,9 +28,9 @@ public static bool IsOnMasterBranch(this GitRepository repository) public static bool IsOnDevelopBranch(this GitRepository repository) { - return repository.Branch?.EqualsOrdinalIgnoreCase("dev") ?? - repository.Branch?.EqualsOrdinalIgnoreCase("develop") ?? - repository.Branch?.EqualsOrdinalIgnoreCase("development") ?? false; + return (repository.Branch?.EqualsOrdinalIgnoreCase("dev") ?? false) || + (repository.Branch?.EqualsOrdinalIgnoreCase("develop") ?? false) || + (repository.Branch?.EqualsOrdinalIgnoreCase("development") ?? false); } public static bool IsOnFeatureBranch(this GitRepository repository) From a1ac284b52062c636981d4cc7d15738dd04cbf98 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 00:17:47 +0100 Subject: [PATCH 03/53] Use ElementAtOrDefault in ArrayExtensions.Deconstruct --- .../Collections/Array.Deconstruct.cs | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/source/Nuke.Common/Utilities/Collections/Array.Deconstruct.cs b/source/Nuke.Common/Utilities/Collections/Array.Deconstruct.cs index 8cd3117d7..d3be5673f 100644 --- a/source/Nuke.Common/Utilities/Collections/Array.Deconstruct.cs +++ b/source/Nuke.Common/Utilities/Collections/Array.Deconstruct.cs @@ -13,47 +13,47 @@ public static class ArrayExtensions { public static void Deconstruct(this T[] items, out T t0) { - t0 = items.Length > 0 ? items[0] : default(T); + t0 = items.ElementAtOrDefault(0); } public static void Deconstruct(this T[] items, out T t0, out T t1) { - t0 = items.Length > 0 ? items[0] : default(T); - t1 = items.Length > 1 ? items[1] : default(T); + t0 = items.ElementAtOrDefault(0); + t1 = items.ElementAtOrDefault(1); } public static void Deconstruct(this T[] items, out T t0, out T t1, out T t2) { - t0 = items.Length > 0 ? items[0] : default(T); - t1 = items.Length > 1 ? items[1] : default(T); - t2 = items.Length > 2 ? items[2] : default(T); + t0 = items.ElementAtOrDefault(0); + t1 = items.ElementAtOrDefault(1); + t2 = items.ElementAtOrDefault(2); } public static void Deconstruct(this T[] items, out T t0, out T t1, out T t2, out T t3) { - t0 = items.Length > 0 ? items[0] : default(T); - t1 = items.Length > 1 ? items[1] : default(T); - t2 = items.Length > 2 ? items[2] : default(T); - t3 = items.Length > 3 ? items[3] : default(T); + t0 = items.ElementAtOrDefault(0); + t1 = items.ElementAtOrDefault(1); + t2 = items.ElementAtOrDefault(2); + t3 = items.ElementAtOrDefault(3); } public static void Deconstruct(this T[] items, out T t0, out T t1, out T t2, out T t3, out T t4) { - t0 = items.Length > 0 ? items[0] : default(T); - t1 = items.Length > 1 ? items[1] : default(T); - t2 = items.Length > 2 ? items[2] : default(T); - t3 = items.Length > 3 ? items[3] : default(T); - t4 = items.Length > 4 ? items[4] : default(T); + t0 = items.ElementAtOrDefault(0); + t1 = items.ElementAtOrDefault(1); + t2 = items.ElementAtOrDefault(2); + t3 = items.ElementAtOrDefault(3); + t4 = items.ElementAtOrDefault(4); } public static void Deconstruct(this T[] items, out T t0, out T t1, out T t2, out T t3, out T t4, out T t5) { - t0 = items.Length > 0 ? items[0] : default(T); - t1 = items.Length > 1 ? items[1] : default(T); - t2 = items.Length > 2 ? items[2] : default(T); - t3 = items.Length > 3 ? items[3] : default(T); - t4 = items.Length > 4 ? items[4] : default(T); - t5 = items.Length > 5 ? items[5] : default(T); + t0 = items.ElementAtOrDefault(0); + t1 = items.ElementAtOrDefault(1); + t2 = items.ElementAtOrDefault(2); + t3 = items.ElementAtOrDefault(3); + t4 = items.ElementAtOrDefault(4); + t5 = items.ElementAtOrDefault(5); } } } From afb02a76717da9f899124bf6ca230356946fdc23 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 00:42:10 +0100 Subject: [PATCH 04/53] Add build extensions as attributes --- source/Nuke.Common/Constants.cs | 6 +++ source/Nuke.Common/Execution/BuildExecutor.cs | 11 ++--- .../Execution/BuildExtensionAttributeBase.cs | 21 +++++++++ .../CheckPathEnvironmentVariableAttribute.cs | 20 ++++++++ .../Execution/HandleHelpRequestsAttribute.cs | 27 +++++++++++ .../HandleShellCompletionAttribute.cs | 47 +++++++++++++++++++ .../HandleVisualStudioDebuggingAttribute.cs | 30 ++++++++++++ source/Nuke.Common/NukeBuild.cs | 3 ++ 8 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs create mode 100644 source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs create mode 100644 source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs create mode 100644 source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs create mode 100644 source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs diff --git a/source/Nuke.Common/Constants.cs b/source/Nuke.Common/Constants.cs index eb2ba1e7f..ec9096c23 100644 --- a/source/Nuke.Common/Constants.cs +++ b/source/Nuke.Common/Constants.cs @@ -18,6 +18,7 @@ internal static class Constants internal const string InvokedTargetsParameterName = "Target"; internal const string SkippedTargetsParameterName = "Skip"; + public const string VisualStudioDebugParameterName = "visual-studio-debug"; internal const string CompletionParameterName = "shell-completion"; [CanBeNull] @@ -45,5 +46,10 @@ internal static PathConstruction.AbsolutePath GetBuildAttemptFile(PathConstructi { return GetTemporaryDirectory(rootDirectory) / "build-attempt.log"; } + + public static PathConstruction.AbsolutePath GetVisualStudioDebugFile(PathConstruction.AbsolutePath rootDirectory) + { + return GetTemporaryDirectory(rootDirectory) / $"{VisualStudioDebugParameterName}.log"; + } } } diff --git a/source/Nuke.Common/Execution/BuildExecutor.cs b/source/Nuke.Common/Execution/BuildExecutor.cs index 42e55c746..498898e48 100644 --- a/source/Nuke.Common/Execution/BuildExecutor.cs +++ b/source/Nuke.Common/Execution/BuildExecutor.cs @@ -9,6 +9,7 @@ using System.IO; using System.Linq; using System.Linq.Expressions; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using Nuke.Common.IO; @@ -32,9 +33,8 @@ public static int Execute(Expression> defaultTargetExpression var executionList = default(IReadOnlyCollection); var build = CreateBuildInstance(defaultTargetExpression); - HandleCompletion(build); - CheckActiveBuildProjectConfigurations(); - AttachVisualStudioDebugger(); + var extensions = build.GetType().GetCustomAttributes().ToList(); + extensions.ForEach(x => x.PreUserCode(build)); Console.CancelKeyPress += (s, e) => Finish(); @@ -49,10 +49,9 @@ public static int Execute(Expression> defaultTargetExpression Logger.Log($"NUKE Execution Engine {typeof(BuildExecutor).Assembly.GetInformationalText()}"); Logger.Log(FigletTransform.GetText("NUKE")); - HandleEarlyExits(build); - ProcessManager.CheckPathEnvironmentVariable(); + extensions.ForEach(x => x.PreInitialization(build)); + InjectionUtility.InjectValues(build); - executionList = TargetDefinitionLoader.GetExecutingTargets(build, NukeBuild.InvokedTargets, NukeBuild.SkippedTargets); RequirementService.ValidateRequirements(executionList, build); diff --git a/source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs b/source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs new file mode 100644 index 000000000..789abe2f6 --- /dev/null +++ b/source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs @@ -0,0 +1,21 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Linq; + +namespace Nuke.Common.Execution +{ + [AttributeUsage(AttributeTargets.Class)] + public abstract class BuildExtensionAttributeBase : Attribute + { + public virtual void PreUserCode(NukeBuild instance) + { + } + + public virtual void PreInitialization(NukeBuild instance) + { + } + } +} diff --git a/source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs b/source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs new file mode 100644 index 000000000..15002b1b7 --- /dev/null +++ b/source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs @@ -0,0 +1,20 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Linq; +using JetBrains.Annotations; +using Nuke.Common.Tooling; + +namespace Nuke.Common.Execution +{ + [PublicAPI] + public class CheckPathEnvironmentVariableAttribute : BuildExtensionAttributeBase + { + public override void PreInitialization(NukeBuild instance) + { + ProcessManager.CheckPathEnvironmentVariable(); + } + } +} diff --git a/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs b/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs new file mode 100644 index 000000000..bb0e711d7 --- /dev/null +++ b/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs @@ -0,0 +1,27 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Linq; + +namespace Nuke.Common.Execution +{ + internal class HandleHelpRequestsAttribute : BuildExtensionAttributeBase + { + public override void PreInitialization(NukeBuild instance) + { + if (NukeBuild.Help) + { + Logger.Log(HelpTextService.GetTargetsText(instance)); + Logger.Log(HelpTextService.GetParametersText(instance)); + } + + if (NukeBuild.Graph) + GraphService.ShowGraph(instance); + + if (NukeBuild.Help || NukeBuild.Graph) + Environment.Exit(exitCode: 0); + } + } +} diff --git a/source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs b/source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs new file mode 100644 index 000000000..cd1eacd98 --- /dev/null +++ b/source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs @@ -0,0 +1,47 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Collections.Generic; +using System.Linq; +using Nuke.Common.IO; +using Nuke.Common.Tooling; + +namespace Nuke.Common.Execution +{ + internal class HandleShellCompletionAttribute : BuildExtensionAttributeBase + { + public override void PreUserCode(NukeBuild instance) + { + var completionItems = new SortedDictionary(); + + var targetNames = instance.TargetDefinitions.Select(x => x.Name).OrderBy(x => x).ToList(); + completionItems[Constants.InvokedTargetsParameterName] = targetNames.ToArray(); + completionItems[Constants.SkippedTargetsParameterName] = targetNames.ToArray(); + + string[] GetSubItems(Type type) + { + if (type.IsEnum) + return type.GetEnumNames(); + if (type.IsSubclassOf(typeof(Enumeration))) + return type.GetFields(ReflectionService.Static).Select(x => x.Name).ToArray(); + return null; + } + + foreach (var parameter in InjectionUtility.GetParameterMembers(instance.GetType())) + { + var parameterName = ParameterService.Instance.GetParameterName(parameter); + if (completionItems.ContainsKey(parameterName)) + continue; + + completionItems[parameterName] = GetSubItems(parameter.GetFieldOrPropertyType())?.OrderBy(x => x).ToArray(); + } + + SerializationTasks.YamlSerializeToFile(completionItems, Constants.GetCompletionFile(NukeBuild.RootDirectory)); + + if (EnvironmentInfo.ParameterSwitch(Constants.CompletionParameterName)) + Environment.Exit(exitCode: 0); + } + } +} diff --git a/source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs b/source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs new file mode 100644 index 000000000..4cc44fbda --- /dev/null +++ b/source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs @@ -0,0 +1,30 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using JetBrains.Annotations; + +namespace Nuke.Common.Execution +{ + [PublicAPI] + public class HandleVisualStudioDebuggingAttribute : BuildExtensionAttributeBase + { + public int TimeoutInMilliseconds { get; } = 10_000; + + public override void PreUserCode(NukeBuild instance) + { + if (!ParameterService.Instance.GetParameter(Constants.VisualStudioDebugParameterName)) + return; + + File.WriteAllText(Constants.GetVisualStudioDebugFile(NukeBuild.RootDirectory), + Process.GetCurrentProcess().Id.ToString()); + ControlFlow.Assert(SpinWait.SpinUntil(() => Debugger.IsAttached, millisecondsTimeout: TimeoutInMilliseconds), + $"VisualStudio debugger was not attached within {TimeoutInMilliseconds} milliseconds."); + } + } +} diff --git a/source/Nuke.Common/NukeBuild.cs b/source/Nuke.Common/NukeBuild.cs index 570e21752..0259e63e6 100644 --- a/source/Nuke.Common/NukeBuild.cs +++ b/source/Nuke.Common/NukeBuild.cs @@ -42,6 +42,9 @@ namespace Nuke.Common /// /// [PublicAPI] + [HandleHelpRequests] + [HandleShellCompletion] + [HandleVisualStudioDebugging] public abstract partial class NukeBuild { /// From 04cfa497ca23488e109fe9bd7e55f750b94a189d Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 13:09:32 +0100 Subject: [PATCH 05/53] Add ToolSettingsExtensions.Multiplex --- build/Build.cs | 37 +++--- .../Generators/TaskGenerator.cs | 110 +++++++++--------- source/Nuke.Common/Tooling/Configure.cs | 2 + .../Tooling/ToolSettingsExtensions.cs | 54 +++++++++ 4 files changed, 126 insertions(+), 77 deletions(-) diff --git a/build/Build.cs b/build/Build.cs index cd86c8b62..406d2c191 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -9,6 +9,7 @@ using Nuke.Common; using Nuke.Common.Git; using Nuke.Common.ProjectModel; +using Nuke.Common.Tooling; using Nuke.Common.Tools.DotNet; using Nuke.Common.Tools.GitVersion; using Nuke.Common.Tools.InspectCode; @@ -86,29 +87,27 @@ partial class Build : NukeBuild .SetFileVersion(GitVersion.GetNormalizedFileVersion()) .SetInformationalVersion(GitVersion.InformationalVersion)); - var publishSettings = new DotNetPublishSettings() + DotNetPublish(s => s .EnableNoRestore() .SetConfiguration(Configuration) .SetAssemblyVersion(GitVersion.GetNormalizedAssemblyVersion()) .SetFileVersion(GitVersion.GetNormalizedFileVersion()) - .SetInformationalVersion(GitVersion.InformationalVersion); - - DotNetPublish(s => publishSettings - .SetProject(GlobalToolProject)); - - DotNetPublish(s => publishSettings - .SetProject(CommonProject) - .SetFramework("netstandard2.0")); - DotNetPublish(s => publishSettings - .SetProject(CommonProject) - .SetFramework("net461")); - - DotNetPublish(s => publishSettings - .SetProject(CodeGenerationProject) - .SetFramework("netstandard2.0")); - DotNetPublish(s => publishSettings - .SetProject(CodeGenerationProject) - .SetFramework("net461")); + .SetInformationalVersion(GitVersion.InformationalVersion) + .Multiplex( + ss => ss + .SetProject(GlobalToolProject), + ss => ss + .SetProject(CommonProject) + .SetFramework("netstandard2.0"), + ss => ss + .SetProject(CommonProject) + .SetFramework("net461"), + ss => ss + .SetProject(CodeGenerationProject) + .SetFramework("netstandard2.0"), + ss => ss + .SetProject(CodeGenerationProject) + .SetFramework("net461"))); }); string ChangelogFile => RootDirectory / "CHANGELOG.md"; diff --git a/source/Nuke.CodeGeneration/Generators/TaskGenerator.cs b/source/Nuke.CodeGeneration/Generators/TaskGenerator.cs index 57c163a00..4d4bcf021 100644 --- a/source/Nuke.CodeGeneration/Generators/TaskGenerator.cs +++ b/source/Nuke.CodeGeneration/Generators/TaskGenerator.cs @@ -30,36 +30,12 @@ public static void Run(Tool tool, ToolWriter toolWriter) w.WriteToolPath(); w.WriteGenericTask(); tool.Tasks.ForEach(x => new TaskWriter(x, toolWriter) - .WriteMainTask() - .WriteTaskOverloads()); + .WriteToolSettingsTask() + .WriteConfiguratorTask() + .WriteMultiplexConfiguratorTask()); }); } - private static TaskWriter WriteTaskOverloads(this TaskWriter writer, int index = 0) - { - var task = writer.Task; - var properties = task.SettingsClass.Properties.Where(x => x.CreateOverload).Take(index + 1).ToList(); - - if (properties.Count == 0 || index >= properties.Count) - return writer; - - var additionalParameterDeclarations = properties.Select(x => $"{x.GetNullabilityAttribute()}{x.Type} {x.Name.ToInstance()}"); - var nextArguments = properties.AsEnumerable().Reverse().Skip(count: 1).Reverse().Select(x => x.Name.ToInstance()); - var currentArgument = properties.Last(); - var setter = $"x => configurator(x).Set{currentArgument.Name}({currentArgument.Name.ToInstance()})"; - var allArguments = nextArguments.Concat(new[] { setter }); - var taskCallPrefix = task.HasReturnValue() ? "return " : string.Empty; - - writer - .WriteSummary(task) - .WriteTaskSignature(additionalParameterDeclarations) - .WriteBlock(w => w - .WriteLine("configurator = configurator ?? (x => x);") - .WriteLine($"return {taskCallPrefix}{task.GetTaskMethodName()}({allArguments.JoinComma()});")); - - return writer.WriteTaskOverloads(index + 1); - } - private static void WriteGenericTask(this ToolWriter writer) { var tool = writer.Tool; @@ -93,26 +69,61 @@ private static void WriteGenericTask(this ToolWriter writer) .WriteLine("return process.Output;")); } - private static TaskWriter WriteMainTask(this TaskWriter writer) + private static TaskWriter WriteToolSettingsTask(this TaskWriter writer) { + var task = writer.Task; + var returnType = task.HasReturnValue() + ? $"({task.ReturnType} Result, IReadOnlyCollection Output)" + : "IReadOnlyCollection"; + return writer - .WriteSummary(writer.Task) - .WriteTaskSignature() - .WriteBlock(WriteMainTaskBlock); + .WriteSummary(task) + .WriteObsoleteAttributeWhenObsolete(task) + .WriteLine($"public static {returnType} {task.GetTaskMethodName()}({task.SettingsClass.Name} toolSettings = null)") + .WriteBlock(w => w + .WriteLine($"toolSettings = toolSettings ?? new {task.SettingsClass.Name}();") + .WriteLineIfTrue(task.PreProcess, "PreProcess(ref toolSettings);") + .WriteLine($"var process = {GetProcessStart(task)};") + .WriteLine(GetProcessAssertion(task)) + .WriteLineIfTrue(task.PostProcess, "PostProcess(toolSettings);") + .WriteLine(task.HasReturnValue() + ? "return (GetResult(process, toolSettings), process.Output);" + : "return process.Output;")); } - private static void WriteMainTaskBlock(TaskWriter writer) + private static TaskWriter WriteConfiguratorTask(this TaskWriter writer) { var task = writer.Task; - writer - .WriteLine($"var toolSettings = configurator.InvokeSafe(new {task.SettingsClass.Name}());") - .WriteLineIfTrue(task.PreProcess, "PreProcess(ref toolSettings);") - .WriteLine($"var process = {GetProcessStart(task)};") - .WriteLine(GetProcessAssertion(task)) - .WriteLineIfTrue(task.PostProcess, "PostProcess(toolSettings);") - .WriteLine(task.HasReturnValue() - ? "return (GetResult(process, toolSettings), process.Output);" - : "return process.Output;"); + var returnType = task.HasReturnValue() + ? $"({task.ReturnType} Result, IReadOnlyCollection Output)" + : "IReadOnlyCollection"; + + return writer + .WriteSummary(task) + .WriteObsoleteAttributeWhenObsolete(task) + .WriteLine($"public static {returnType} {task.GetTaskMethodName()}(Configure<{task.SettingsClass.Name}> configurator)") + .WriteBlock(w => w + .WriteLine($"return {task.GetTaskMethodName()}(configurator(new {task.SettingsClass.Name}()));")); + } + + private static TaskWriter WriteMultiplexConfiguratorTask(this TaskWriter writer) + { + var task = writer.Task; + var returnType = !task.HasReturnValue() + ? $"IEnumerable<({task.SettingsClass.Name} Settings, IReadOnlyCollection Output)>" + : $"IEnumerable<({task.SettingsClass.Name} Settings, {task.ReturnType} Result, IReadOnlyCollection Output)>"; + var selector = !task.HasReturnValue() + ? "(x.ToolSettings, x.ReturnValue)" + : "(x.ToolSettings, x.ReturnValue.Result, x.ReturnValue.Output)"; + + return writer + .WriteSummary(task) + .WriteObsoleteAttributeWhenObsolete(task) + .WriteLine($"public static {returnType} {task.GetTaskMethodName()}(MultiplexConfigure<{task.SettingsClass.Name}> configurator)") + .WriteBlock(w => w + .WriteLine($"return configurator(new {task.SettingsClass.Name}())") + .WriteLine($" .Select(x => (ToolSettings: x, ReturnValue: {task.GetTaskMethodName()}(x)))") + .WriteLine($" .Select(x => {selector}).ToList();")); } private static string GetProcessStart(Task task) @@ -155,22 +166,5 @@ private static ToolWriter WriteToolPath(this ToolWriter writer) .WriteLine($" ToolPathResolver.TryGetEnvironmentExecutable(\"{tool.Name.ToUpperInvariant()}_EXE\") ??") .WriteLine($" {resolvers.Single()};"); } - - private static T WriteTaskSignature(this T writer, IEnumerable additionalParameterDeclarations = null) - where T : TaskWriter - { - var task = writer.Task; - var parameterDeclarations = new List(); - parameterDeclarations.AddRange(additionalParameterDeclarations ?? new List()); - parameterDeclarations.Add($"Configure<{task.SettingsClass.Name}> configurator = null"); - - var returnType = task.HasReturnValue() - ? $"({task.ReturnType} Result, IReadOnlyCollection Output)" - : "IReadOnlyCollection"; - - return writer - .WriteObsoleteAttributeWhenObsolete(task) - .WriteLine($"public static {returnType} {task.GetTaskMethodName()}({parameterDeclarations.JoinComma()})"); - } } } diff --git a/source/Nuke.Common/Tooling/Configure.cs b/source/Nuke.Common/Tooling/Configure.cs index 7bbc0e073..deebf6af9 100644 --- a/source/Nuke.Common/Tooling/Configure.cs +++ b/source/Nuke.Common/Tooling/Configure.cs @@ -3,12 +3,14 @@ // https://github.com/nuke-build/nuke/blob/master/LICENSE using System; +using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; namespace Nuke.Common.Tooling { public delegate T Configure(T settings); + public delegate IEnumerable MultiplexConfigure(T settings); public static class ConfigureExtensions { diff --git a/source/Nuke.Common/Tooling/ToolSettingsExtensions.cs b/source/Nuke.Common/Tooling/ToolSettingsExtensions.cs index f0a1628c9..052089124 100644 --- a/source/Nuke.Common/Tooling/ToolSettingsExtensions.cs +++ b/source/Nuke.Common/Tooling/ToolSettingsExtensions.cs @@ -3,6 +3,7 @@ // https://github.com/nuke-build/nuke/blob/master/LICENSE using System; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using JetBrains.Annotations; @@ -19,6 +20,59 @@ public static T When(this T settings, bool condition, Configure configurat return condition ? configurator(settings) : settings; } + public static T[] Multiplex(this T toolSettings, params Configure[] configurators) + where T : ToolSettings + { + return configurators.Select(x => x(toolSettings)).ToArray(); + } + + public static T[] Multiplex(this T toolSettings, params MultiplexConfigure[] configurators) + where T : ToolSettings + { + return configurators.SelectMany(x => x(toolSettings)).ToArray(); + } + + public static T[] Multiplex(this T toolSettings, Func configurator, params TValue[] values) + where T : ToolSettings + { + return values.Select(x => configurator(toolSettings, x)).ToArray(); + } + + public static T[] Multiplex(this T toolSettings, Func configurator, IEnumerable values) + where T : ToolSettings + { + return values.Select(x => configurator(toolSettings, x)).ToArray(); + } + + public static T[] Multiplex(this IEnumerable toolSettings, Func configurator, params TValue[] values) + where T : ToolSettings + { + return toolSettings.SelectMany(x => values.Select(y => configurator(x, y))).ToArray(); + } + + public static T[] Multiplex(this IEnumerable toolSettings, Func configurator, IEnumerable values) + where T : ToolSettings + { + return toolSettings.SelectMany(x => values.Select(y => configurator(x, y))).ToArray(); + } + + public static T[] Multiplex(this T toolSettings, Func> configurator, params TValue[] values) + where T : ToolSettings + { + return values.SelectMany(x => configurator(toolSettings, x)).ToArray(); + } + public static T[] Multiplex(this T toolSettings, Func> configurator, IEnumerable values) + where T : ToolSettings + { + return values.SelectMany(x => configurator(toolSettings, x)).ToArray(); + } + + public static T[] Multiplex(this IEnumerable toolSettings, Func> configurator, params TValue[] values) + where T : ToolSettings + { + return toolSettings.SelectMany(x => values.SelectMany(y => configurator(x, y))).ToArray(); + } + [Pure] public static T AddEnvironmentVariable( this T toolSettings, From 10d7ef89cca4ac92553ed1622983f75784250842 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 19:51:12 +0100 Subject: [PATCH 06/53] Regenerate --- .../CoverallsNet/CoverallsNet.Generated.cs | 16 ++- .../Tools/Coverlet/Coverlet.Generated.cs | 16 ++- .../Tools/DotCover/DotCover.Generated.cs | 96 +++++++++++-- .../Tools/DotNet/DotNet.Generated.cs | 128 ++++++++++++++---- .../Tools/DupFinder/DupFinder.Generated.cs | 16 ++- .../Tools/GitLink/GitLink.Generated.cs | 32 ++++- .../GitReleaseManager.Generated.cs | 80 +++++++++-- .../Tools/GitVersion/GitVersion.Generated.cs | 16 ++- .../InspectCode/InspectCode.Generated.cs | 16 +-- .../Tools/MSBuild/MSBuild.Generated.cs | 16 ++- .../Tools/MSpec/MSpec.Generated.cs | 16 ++- source/Nuke.Common/Tools/Npm/Npm.Generated.cs | 32 ++++- .../Tools/NuGet/NuGet.Generated.cs | 48 +++++-- .../Tools/Nunit/Nunit3.Generated.cs | 16 ++- .../Tools/Octopus/Octopus.Generated.cs | 64 +++++++-- .../Tools/OpenCover/OpenCover.Generated.cs | 16 ++- .../Tools/Paket/Paket.Generated.cs | 64 +++++++-- .../ReportGenerator.Generated.cs | 16 ++- .../Tools/SignTool/SignTool.Generated.cs | 16 ++- .../SonarScanner/SonarScanner.Generated.cs | 32 ++++- .../Tools/SpecFlow/SpecFlow.Generated.cs | 128 +++++++++++++++--- .../Tools/Squirrel/Squirrel.Generated.cs | 16 ++- .../Tools/TestCloud/TestCloud.Generated.cs | 16 ++- .../Tools/Unity/Unity.Generated.cs | 64 +++++++-- .../Tools/VSTest/VSTest.Generated.cs | 16 ++- .../Tools/VSWhere/VSWhere.Generated.cs | 16 ++- .../WebConfigTransformRunner.Generated.cs | 16 ++- .../Tools/Xunit/Xunit.Generated.cs | 16 ++- 28 files changed, 874 insertions(+), 166 deletions(-) diff --git a/source/Nuke.Common/Tools/CoverallsNet/CoverallsNet.Generated.cs b/source/Nuke.Common/Tools/CoverallsNet/CoverallsNet.Generated.cs index 78e403cbe..bd1eb118e 100644 --- a/source/Nuke.Common/Tools/CoverallsNet/CoverallsNet.Generated.cs +++ b/source/Nuke.Common/Tools/CoverallsNet/CoverallsNet.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection CoverallsNet(string arguments, string return process.Output; } ///

Coveralls uploader for .Net Code coverage of your C# source code. Should work with any code files that get reported with the supported coverage tools, but the primary focus is CSharp.

For more details, visit the official website.

- public static IReadOnlyCollection CoverallsNet(Configure configurator = null) + public static IReadOnlyCollection CoverallsNet(CoverallsNetSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new CoverallsNetSettings()); + toolSettings = toolSettings ?? new CoverallsNetSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Coveralls uploader for .Net Code coverage of your C# source code. Should work with any code files that get reported with the supported coverage tools, but the primary focus is CSharp.

For more details, visit the official website.

+ public static IReadOnlyCollection CoverallsNet(Configure configurator) + { + return CoverallsNet(configurator(new CoverallsNetSettings())); + } + ///

Coveralls uploader for .Net Code coverage of your C# source code. Should work with any code files that get reported with the supported coverage tools, but the primary focus is CSharp.

For more details, visit the official website.

+ public static IEnumerable<(CoverallsNetSettings Settings, IReadOnlyCollection Output)> CoverallsNet(MultiplexConfigure configurator) + { + return configurator(new CoverallsNetSettings()) + .Select(x => (ToolSettings: x, ReturnValue: CoverallsNet(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region CoverallsNetSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/Coverlet/Coverlet.Generated.cs b/source/Nuke.Common/Tools/Coverlet/Coverlet.Generated.cs index ca3635830..ab0dc03c7 100644 --- a/source/Nuke.Common/Tools/Coverlet/Coverlet.Generated.cs +++ b/source/Nuke.Common/Tools/Coverlet/Coverlet.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection Coverlet(string arguments, string work return process.Output; } ///

Coverlet is a cross platform code coverage library for .NET Core, with support for line, branch and method coverage.The dotnet test command is used to execute unit tests in a given project. Unit tests are console application projects that have dependencies on the unit test framework (for example, MSTest, NUnit, or xUnit) and the dotnet test runner for the unit testing framework. These are packaged as NuGet packages and are restored as ordinary dependencies for the project.

For more details, visit the official website.

- public static IReadOnlyCollection Coverlet(Configure configurator = null) + public static IReadOnlyCollection Coverlet(CoverletSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new CoverletSettings()); + toolSettings = toolSettings ?? new CoverletSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Coverlet is a cross platform code coverage library for .NET Core, with support for line, branch and method coverage.The dotnet test command is used to execute unit tests in a given project. Unit tests are console application projects that have dependencies on the unit test framework (for example, MSTest, NUnit, or xUnit) and the dotnet test runner for the unit testing framework. These are packaged as NuGet packages and are restored as ordinary dependencies for the project.

For more details, visit the official website.

+ public static IReadOnlyCollection Coverlet(Configure configurator) + { + return Coverlet(configurator(new CoverletSettings())); + } + ///

Coverlet is a cross platform code coverage library for .NET Core, with support for line, branch and method coverage.The dotnet test command is used to execute unit tests in a given project. Unit tests are console application projects that have dependencies on the unit test framework (for example, MSTest, NUnit, or xUnit) and the dotnet test runner for the unit testing framework. These are packaged as NuGet packages and are restored as ordinary dependencies for the project.

For more details, visit the official website.

+ public static IEnumerable<(CoverletSettings Settings, IReadOnlyCollection Output)> Coverlet(MultiplexConfigure configurator) + { + return configurator(new CoverletSettings()) + .Select(x => (ToolSettings: x, ReturnValue: Coverlet(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region CoverletSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/DotCover/DotCover.Generated.cs b/source/Nuke.Common/Tools/DotCover/DotCover.Generated.cs index 5bd915c6d..9c0c52cc5 100644 --- a/source/Nuke.Common/Tools/DotCover/DotCover.Generated.cs +++ b/source/Nuke.Common/Tools/DotCover/DotCover.Generated.cs @@ -35,53 +35,125 @@ public static IReadOnlyCollection DotCover(string arguments, string work return process.Output; } ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

- public static IReadOnlyCollection DotCoverAnalyse(Configure configurator = null) + public static IReadOnlyCollection DotCoverAnalyse(DotCoverAnalyseSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotCoverAnalyseSettings()); + toolSettings = toolSettings ?? new DotCoverAnalyseSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

- public static IReadOnlyCollection DotCoverCover(Configure configurator = null) + public static IReadOnlyCollection DotCoverAnalyse(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new DotCoverCoverSettings()); + return DotCoverAnalyse(configurator(new DotCoverAnalyseSettings())); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IEnumerable<(DotCoverAnalyseSettings Settings, IReadOnlyCollection Output)> DotCoverAnalyse(MultiplexConfigure configurator) + { + return configurator(new DotCoverAnalyseSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotCoverAnalyse(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IReadOnlyCollection DotCoverCover(DotCoverCoverSettings toolSettings = null) + { + toolSettings = toolSettings ?? new DotCoverCoverSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

- public static IReadOnlyCollection DotCoverDelete(Configure configurator = null) + public static IReadOnlyCollection DotCoverCover(Configure configurator) + { + return DotCoverCover(configurator(new DotCoverCoverSettings())); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IEnumerable<(DotCoverCoverSettings Settings, IReadOnlyCollection Output)> DotCoverCover(MultiplexConfigure configurator) { - var toolSettings = configurator.InvokeSafe(new DotCoverDeleteSettings()); + return configurator(new DotCoverCoverSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotCoverCover(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IReadOnlyCollection DotCoverDelete(DotCoverDeleteSettings toolSettings = null) + { + toolSettings = toolSettings ?? new DotCoverDeleteSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

- public static IReadOnlyCollection DotCoverMerge(Configure configurator = null) + public static IReadOnlyCollection DotCoverDelete(Configure configurator) + { + return DotCoverDelete(configurator(new DotCoverDeleteSettings())); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IEnumerable<(DotCoverDeleteSettings Settings, IReadOnlyCollection Output)> DotCoverDelete(MultiplexConfigure configurator) + { + return configurator(new DotCoverDeleteSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotCoverDelete(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IReadOnlyCollection DotCoverMerge(DotCoverMergeSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotCoverMergeSettings()); + toolSettings = toolSettings ?? new DotCoverMergeSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

- public static IReadOnlyCollection DotCoverReport(Configure configurator = null) + public static IReadOnlyCollection DotCoverMerge(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new DotCoverReportSettings()); + return DotCoverMerge(configurator(new DotCoverMergeSettings())); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IEnumerable<(DotCoverMergeSettings Settings, IReadOnlyCollection Output)> DotCoverMerge(MultiplexConfigure configurator) + { + return configurator(new DotCoverMergeSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotCoverMerge(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IReadOnlyCollection DotCoverReport(DotCoverReportSettings toolSettings = null) + { + toolSettings = toolSettings ?? new DotCoverReportSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

- public static IReadOnlyCollection DotCoverZip(Configure configurator = null) + public static IReadOnlyCollection DotCoverReport(Configure configurator) + { + return DotCoverReport(configurator(new DotCoverReportSettings())); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IEnumerable<(DotCoverReportSettings Settings, IReadOnlyCollection Output)> DotCoverReport(MultiplexConfigure configurator) { - var toolSettings = configurator.InvokeSafe(new DotCoverZipSettings()); + return configurator(new DotCoverReportSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotCoverReport(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IReadOnlyCollection DotCoverZip(DotCoverZipSettings toolSettings = null) + { + toolSettings = toolSettings ?? new DotCoverZipSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IReadOnlyCollection DotCoverZip(Configure configurator) + { + return DotCoverZip(configurator(new DotCoverZipSettings())); + } + ///

dotCover is a .NET unit testing and code coverage tool that works right in Visual Studio, helps you know to what extent your code is covered with unit tests, provides great ways to visualize code coverage, and is Continuous Integration ready. dotCover calculates and reports statement-level code coverage in applications targeting .NET Framework, Silverlight, and .NET Core.

For more details, visit the official website.

+ public static IEnumerable<(DotCoverZipSettings Settings, IReadOnlyCollection Output)> DotCoverZip(MultiplexConfigure configurator) + { + return configurator(new DotCoverZipSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotCoverZip(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region DotCoverAnalyseSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/DotNet/DotNet.Generated.cs b/source/Nuke.Common/Tools/DotNet/DotNet.Generated.cs index 27ce91f57..3136eec03 100644 --- a/source/Nuke.Common/Tools/DotNet/DotNet.Generated.cs +++ b/source/Nuke.Common/Tools/DotNet/DotNet.Generated.cs @@ -34,93 +34,165 @@ public static IReadOnlyCollection DotNet(string arguments, string workin return process.Output; } ///

The dotnet test command is used to execute unit tests in a given project. Unit tests are console application projects that have dependencies on the unit test framework (for example, MSTest, NUnit, or xUnit) and the dotnet test runner for the unit testing framework. These are packaged as NuGet packages and are restored as ordinary dependencies for the project.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetTest(Configure configurator = null) + public static IReadOnlyCollection DotNetTest(DotNetTestSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetTestSettings()); + toolSettings = toolSettings ?? new DotNetTestSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

The dotnet test command is used to execute unit tests in a given project. Unit tests are console application projects that have dependencies on the unit test framework (for example, MSTest, NUnit, or xUnit) and the dotnet test runner for the unit testing framework. These are packaged as NuGet packages and are restored as ordinary dependencies for the project.

For more details, visit the official website.

+ public static IReadOnlyCollection DotNetTest(Configure configurator) + { + return DotNetTest(configurator(new DotNetTestSettings())); + } + ///

The dotnet test command is used to execute unit tests in a given project. Unit tests are console application projects that have dependencies on the unit test framework (for example, MSTest, NUnit, or xUnit) and the dotnet test runner for the unit testing framework. These are packaged as NuGet packages and are restored as ordinary dependencies for the project.

For more details, visit the official website.

+ public static IEnumerable<(DotNetTestSettings Settings, IReadOnlyCollection Output)> DotNetTest(MultiplexConfigure configurator) + { + return configurator(new DotNetTestSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetTest(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

The dotnet run command provides a convenient option to run your application from the source code with one command. It's useful for fast iterative development from the command line. The command depends on the dotnet build command to build the code. Any requirements for the build, such as that the project must be restored first, apply to dotnet run as well.

Output files are written into the default location, which is bin/<configuration>/<target>. For example if you have a netcoreapp1.0 application and you run dotnet run, the output is placed in bin/Debug/netcoreapp1.0. Files are overwritten as needed. Temporary files are placed in the obj directory.

If the project specifies multiple frameworks, executing dotnet run results in an error unless the -f|--framework <FRAMEWORK> option is used to specify the framework.

The dotnet run command is used in the context of projects, not built assemblies. If you're trying to run a framework-dependent application DLL instead, you must use dotnet without a command. For example, to run myapp.dll, use: dotnet myapp.dll

For more information on the dotnet driver, see the .NET Core Command Line Tools (CLI) topic.

In order to run the application, the dotnet run command resolves the dependencies of the application that are outside of the shared runtime from the NuGet cache. Because it uses cached dependencies, it's not recommended to use dotnet run to run applications in production. Instead, create a deployment using the dotnet publish command and deploy the published output.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetRun(Configure configurator = null) + public static IReadOnlyCollection DotNetRun(DotNetRunSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetRunSettings()); + toolSettings = toolSettings ?? new DotNetRunSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

The dotnet run command provides a convenient option to run your application from the source code with one command. It's useful for fast iterative development from the command line. The command depends on the dotnet build command to build the code. Any requirements for the build, such as that the project must be restored first, apply to dotnet run as well.

Output files are written into the default location, which is bin/<configuration>/<target>. For example if you have a netcoreapp1.0 application and you run dotnet run, the output is placed in bin/Debug/netcoreapp1.0. Files are overwritten as needed. Temporary files are placed in the obj directory.

If the project specifies multiple frameworks, executing dotnet run results in an error unless the -f|--framework <FRAMEWORK> option is used to specify the framework.

The dotnet run command is used in the context of projects, not built assemblies. If you're trying to run a framework-dependent application DLL instead, you must use dotnet without a command. For example, to run myapp.dll, use: dotnet myapp.dll

For more information on the dotnet driver, see the .NET Core Command Line Tools (CLI) topic.

In order to run the application, the dotnet run command resolves the dependencies of the application that are outside of the shared runtime from the NuGet cache. Because it uses cached dependencies, it's not recommended to use dotnet run to run applications in production. Instead, create a deployment using the dotnet publish command and deploy the published output.

For more details, visit the official website.

+ public static IReadOnlyCollection DotNetRun(Configure configurator) + { + return DotNetRun(configurator(new DotNetRunSettings())); + } + ///

The dotnet run command provides a convenient option to run your application from the source code with one command. It's useful for fast iterative development from the command line. The command depends on the dotnet build command to build the code. Any requirements for the build, such as that the project must be restored first, apply to dotnet run as well.

Output files are written into the default location, which is bin/<configuration>/<target>. For example if you have a netcoreapp1.0 application and you run dotnet run, the output is placed in bin/Debug/netcoreapp1.0. Files are overwritten as needed. Temporary files are placed in the obj directory.

If the project specifies multiple frameworks, executing dotnet run results in an error unless the -f|--framework <FRAMEWORK> option is used to specify the framework.

The dotnet run command is used in the context of projects, not built assemblies. If you're trying to run a framework-dependent application DLL instead, you must use dotnet without a command. For example, to run myapp.dll, use: dotnet myapp.dll

For more information on the dotnet driver, see the .NET Core Command Line Tools (CLI) topic.

In order to run the application, the dotnet run command resolves the dependencies of the application that are outside of the shared runtime from the NuGet cache. Because it uses cached dependencies, it's not recommended to use dotnet run to run applications in production. Instead, create a deployment using the dotnet publish command and deploy the published output.

For more details, visit the official website.

+ public static IEnumerable<(DotNetRunSettings Settings, IReadOnlyCollection Output)> DotNetRun(MultiplexConfigure configurator) + { + return configurator(new DotNetRunSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetRun(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

The dotnet restore command uses NuGet to restore dependencies as well as project-specific tools that are specified in the project file. By default, the restoration of dependencies and tools are performed in parallel.

Starting with .NET Core 2.0, you don't have to run dotnet restore because it's run implicitly by all commands, such as dotnet build and dotnet run, that require a restore to occur. It's still a valid command in certain scenarios where doing an explicit restore makes sense, such as continuous integration builds in Visual Studio Team Services or in build systems that need to explicitly control the time at which the restore occurs.

In order to restore the dependencies, NuGet needs the feeds where the packages are located. Feeds are usually provided via the NuGet.config configuration file. A default configuration file is provided when the CLI tools are installed. You specify additional feeds by creating your own NuGet.config file in the project directory. You also specify additional feeds per invocation at a command prompt.

For dependencies, you specify where the restored packages are placed during the restore operation using the --packages argument. If not specified, the default NuGet package cache is used, which is found in the .nuget/packages directory in the user's home directory on all operating systems (for example, /home/user1 on Linux or C:\Users\user1 on Windows).

For project-specific tooling, dotnet restore first restores the package in which the tool is packed, and then proceeds to restore the tool's dependencies as specified in its project file.

The behavior of the dotnet restore command is affected by some of the settings in the Nuget.Config file, if present. For example, setting the globalPackagesFolder in NuGet.Config places the restored NuGet packages in the specified folder. This is an alternative to specifying the --packages option on the dotnet restore command. For more information, see the NuGet.Config reference.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetRestore(Configure configurator = null) + public static IReadOnlyCollection DotNetRestore(DotNetRestoreSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetRestoreSettings()); + toolSettings = toolSettings ?? new DotNetRestoreSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The dotnet restore command uses NuGet to restore dependencies as well as project-specific tools that are specified in the project file. By default, the restoration of dependencies and tools are performed in parallel.

Starting with .NET Core 2.0, you don't have to run dotnet restore because it's run implicitly by all commands, such as dotnet build and dotnet run, that require a restore to occur. It's still a valid command in certain scenarios where doing an explicit restore makes sense, such as continuous integration builds in Visual Studio Team Services or in build systems that need to explicitly control the time at which the restore occurs.

In order to restore the dependencies, NuGet needs the feeds where the packages are located. Feeds are usually provided via the NuGet.config configuration file. A default configuration file is provided when the CLI tools are installed. You specify additional feeds by creating your own NuGet.config file in the project directory. You also specify additional feeds per invocation at a command prompt.

For dependencies, you specify where the restored packages are placed during the restore operation using the --packages argument. If not specified, the default NuGet package cache is used, which is found in the .nuget/packages directory in the user's home directory on all operating systems (for example, /home/user1 on Linux or C:\Users\user1 on Windows).

For project-specific tooling, dotnet restore first restores the package in which the tool is packed, and then proceeds to restore the tool's dependencies as specified in its project file.

The behavior of the dotnet restore command is affected by some of the settings in the Nuget.Config file, if present. For example, setting the globalPackagesFolder in NuGet.Config places the restored NuGet packages in the specified folder. This is an alternative to specifying the --packages option on the dotnet restore command. For more information, see the NuGet.Config reference.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetRestore(string projectFile, Configure configurator = null) + public static IReadOnlyCollection DotNetRestore(Configure configurator) { - configurator = configurator ?? (x => x); - return DotNetRestore(x => configurator(x).SetProjectFile(projectFile)); + return DotNetRestore(configurator(new DotNetRestoreSettings())); + } + ///

The dotnet restore command uses NuGet to restore dependencies as well as project-specific tools that are specified in the project file. By default, the restoration of dependencies and tools are performed in parallel.

Starting with .NET Core 2.0, you don't have to run dotnet restore because it's run implicitly by all commands, such as dotnet build and dotnet run, that require a restore to occur. It's still a valid command in certain scenarios where doing an explicit restore makes sense, such as continuous integration builds in Visual Studio Team Services or in build systems that need to explicitly control the time at which the restore occurs.

In order to restore the dependencies, NuGet needs the feeds where the packages are located. Feeds are usually provided via the NuGet.config configuration file. A default configuration file is provided when the CLI tools are installed. You specify additional feeds by creating your own NuGet.config file in the project directory. You also specify additional feeds per invocation at a command prompt.

For dependencies, you specify where the restored packages are placed during the restore operation using the --packages argument. If not specified, the default NuGet package cache is used, which is found in the .nuget/packages directory in the user's home directory on all operating systems (for example, /home/user1 on Linux or C:\Users\user1 on Windows).

For project-specific tooling, dotnet restore first restores the package in which the tool is packed, and then proceeds to restore the tool's dependencies as specified in its project file.

The behavior of the dotnet restore command is affected by some of the settings in the Nuget.Config file, if present. For example, setting the globalPackagesFolder in NuGet.Config places the restored NuGet packages in the specified folder. This is an alternative to specifying the --packages option on the dotnet restore command. For more information, see the NuGet.Config reference.

For more details, visit the official website.

+ public static IEnumerable<(DotNetRestoreSettings Settings, IReadOnlyCollection Output)> DotNetRestore(MultiplexConfigure configurator) + { + return configurator(new DotNetRestoreSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetRestore(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } ///

The dotnet pack command builds the project and creates NuGet packages. The result of this command is a NuGet package. If the --include-symbols option is present, another package containing the debug symbols is created.

NuGet dependencies of the packed project are added to the .nuspec file, so they're properly resolved when the package is installed. Project-to-project references aren't packaged inside the project. Currently, you must have a package per project if you have project-to-project dependencies.

By default, dotnet pack builds the project first. If you wish to avoid this behavior, pass the --no-build option. This is often useful in Continuous Integration (CI) build scenarios where you know the code was previously built.

You can provide MSBuild properties to the dotnet pack command for the packing process. For more information, see NuGet metadata properties and the MSBuild Command-Line Reference.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetPack(Configure configurator = null) + public static IReadOnlyCollection DotNetPack(DotNetPackSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetPackSettings()); + toolSettings = toolSettings ?? new DotNetPackSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The dotnet pack command builds the project and creates NuGet packages. The result of this command is a NuGet package. If the --include-symbols option is present, another package containing the debug symbols is created.

NuGet dependencies of the packed project are added to the .nuspec file, so they're properly resolved when the package is installed. Project-to-project references aren't packaged inside the project. Currently, you must have a package per project if you have project-to-project dependencies.

By default, dotnet pack builds the project first. If you wish to avoid this behavior, pass the --no-build option. This is often useful in Continuous Integration (CI) build scenarios where you know the code was previously built.

You can provide MSBuild properties to the dotnet pack command for the packing process. For more information, see NuGet metadata properties and the MSBuild Command-Line Reference.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetPack(string project, Configure configurator = null) + public static IReadOnlyCollection DotNetPack(Configure configurator) + { + return DotNetPack(configurator(new DotNetPackSettings())); + } + ///

The dotnet pack command builds the project and creates NuGet packages. The result of this command is a NuGet package. If the --include-symbols option is present, another package containing the debug symbols is created.

NuGet dependencies of the packed project are added to the .nuspec file, so they're properly resolved when the package is installed. Project-to-project references aren't packaged inside the project. Currently, you must have a package per project if you have project-to-project dependencies.

By default, dotnet pack builds the project first. If you wish to avoid this behavior, pass the --no-build option. This is often useful in Continuous Integration (CI) build scenarios where you know the code was previously built.

You can provide MSBuild properties to the dotnet pack command for the packing process. For more information, see NuGet metadata properties and the MSBuild Command-Line Reference.

For more details, visit the official website.

+ public static IEnumerable<(DotNetPackSettings Settings, IReadOnlyCollection Output)> DotNetPack(MultiplexConfigure configurator) { - configurator = configurator ?? (x => x); - return DotNetPack(x => configurator(x).SetProject(project)); + return configurator(new DotNetPackSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetPack(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } ///

The dotnet build command builds the project and its dependencies into a set of binaries. The binaries include the project's code in Intermediate Language (IL) files with a .dll extension and symbol files used for debugging with a .pdb extension. A dependencies JSON file (*.deps.json) is produced that lists the dependencies of the application. A .runtimeconfig.json file is produced, which specifies the shared runtime and its version for the application.

If the project has third-party dependencies, such as libraries from NuGet, they're resolved from the NuGet cache and aren't available with the project's built output. With that in mind, the product of dotnet buildd isn't ready to be transferred to another machine to run. This is in contrast to the behavior of the .NET Framework in which building an executable project (an application) produces output that's runnable on any machine where the .NET Framework is installed. To have a similar experience with .NET Core, you use the dotnet publish command. For more information, see .NET Core Application Deployment.

Building requires the project.assets.json file, which lists the dependencies of your application. The file is created dotnet restore is executed. Without the assets file in place, the tooling cannot resolve reference assemblies, which will result in errors. With .NET Core 1.x SDK, you needed to explicitily run the dotnet restore before running dotnet build. Starting with .NET Core 2.0 SDK, dotnet restore runs implicitily when you run dotnet build. If you want to disable implicit restore when running the build command, you can pass the --no-restore option.

dotnet build uses MSBuild to build the project; thus, it supports both parallel and incremental builds. Refer to Incremental Builds for more information.

In addition to its options, the dotnet build command accepts MSBuild options, such as /p for setting properties or /l to define a logger. Learn more about these options in the MSBuild Command-Line Reference.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetBuild(Configure configurator = null) + public static IReadOnlyCollection DotNetBuild(DotNetBuildSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetBuildSettings()); + toolSettings = toolSettings ?? new DotNetBuildSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The dotnet build command builds the project and its dependencies into a set of binaries. The binaries include the project's code in Intermediate Language (IL) files with a .dll extension and symbol files used for debugging with a .pdb extension. A dependencies JSON file (*.deps.json) is produced that lists the dependencies of the application. A .runtimeconfig.json file is produced, which specifies the shared runtime and its version for the application.

If the project has third-party dependencies, such as libraries from NuGet, they're resolved from the NuGet cache and aren't available with the project's built output. With that in mind, the product of dotnet buildd isn't ready to be transferred to another machine to run. This is in contrast to the behavior of the .NET Framework in which building an executable project (an application) produces output that's runnable on any machine where the .NET Framework is installed. To have a similar experience with .NET Core, you use the dotnet publish command. For more information, see .NET Core Application Deployment.

Building requires the project.assets.json file, which lists the dependencies of your application. The file is created dotnet restore is executed. Without the assets file in place, the tooling cannot resolve reference assemblies, which will result in errors. With .NET Core 1.x SDK, you needed to explicitily run the dotnet restore before running dotnet build. Starting with .NET Core 2.0 SDK, dotnet restore runs implicitily when you run dotnet build. If you want to disable implicit restore when running the build command, you can pass the --no-restore option.

dotnet build uses MSBuild to build the project; thus, it supports both parallel and incremental builds. Refer to Incremental Builds for more information.

In addition to its options, the dotnet build command accepts MSBuild options, such as /p for setting properties or /l to define a logger. Learn more about these options in the MSBuild Command-Line Reference.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetBuild(string projectFile, Configure configurator = null) + public static IReadOnlyCollection DotNetBuild(Configure configurator) { - configurator = configurator ?? (x => x); - return DotNetBuild(x => configurator(x).SetProjectFile(projectFile)); + return DotNetBuild(configurator(new DotNetBuildSettings())); + } + ///

The dotnet build command builds the project and its dependencies into a set of binaries. The binaries include the project's code in Intermediate Language (IL) files with a .dll extension and symbol files used for debugging with a .pdb extension. A dependencies JSON file (*.deps.json) is produced that lists the dependencies of the application. A .runtimeconfig.json file is produced, which specifies the shared runtime and its version for the application.

If the project has third-party dependencies, such as libraries from NuGet, they're resolved from the NuGet cache and aren't available with the project's built output. With that in mind, the product of dotnet buildd isn't ready to be transferred to another machine to run. This is in contrast to the behavior of the .NET Framework in which building an executable project (an application) produces output that's runnable on any machine where the .NET Framework is installed. To have a similar experience with .NET Core, you use the dotnet publish command. For more information, see .NET Core Application Deployment.

Building requires the project.assets.json file, which lists the dependencies of your application. The file is created dotnet restore is executed. Without the assets file in place, the tooling cannot resolve reference assemblies, which will result in errors. With .NET Core 1.x SDK, you needed to explicitily run the dotnet restore before running dotnet build. Starting with .NET Core 2.0 SDK, dotnet restore runs implicitily when you run dotnet build. If you want to disable implicit restore when running the build command, you can pass the --no-restore option.

dotnet build uses MSBuild to build the project; thus, it supports both parallel and incremental builds. Refer to Incremental Builds for more information.

In addition to its options, the dotnet build command accepts MSBuild options, such as /p for setting properties or /l to define a logger. Learn more about these options in the MSBuild Command-Line Reference.

For more details, visit the official website.

+ public static IEnumerable<(DotNetBuildSettings Settings, IReadOnlyCollection Output)> DotNetBuild(MultiplexConfigure configurator) + { + return configurator(new DotNetBuildSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetBuild(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } ///

The dotnet clean command cleans the output of the previous build. It's implemented as an MSBuild target, so the project is evaluated when the command is run. Only the outputs created during the build are cleaned. Both intermediate (obj) and final output (bin) folders are cleaned.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetClean(Configure configurator = null) + public static IReadOnlyCollection DotNetClean(DotNetCleanSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetCleanSettings()); + toolSettings = toolSettings ?? new DotNetCleanSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The dotnet clean command cleans the output of the previous build. It's implemented as an MSBuild target, so the project is evaluated when the command is run. Only the outputs created during the build are cleaned. Both intermediate (obj) and final output (bin) folders are cleaned.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetClean(string project, Configure configurator = null) + public static IReadOnlyCollection DotNetClean(Configure configurator) { - configurator = configurator ?? (x => x); - return DotNetClean(x => configurator(x).SetProject(project)); + return DotNetClean(configurator(new DotNetCleanSettings())); + } + ///

The dotnet clean command cleans the output of the previous build. It's implemented as an MSBuild target, so the project is evaluated when the command is run. Only the outputs created during the build are cleaned. Both intermediate (obj) and final output (bin) folders are cleaned.

For more details, visit the official website.

+ public static IEnumerable<(DotNetCleanSettings Settings, IReadOnlyCollection Output)> DotNetClean(MultiplexConfigure configurator) + { + return configurator(new DotNetCleanSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetClean(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } ///

dotnet publish compiles the application, reads through its dependencies specified in the project file, and publishes the resulting set of files to a directory. The output will contain the following:

  • Intermediate Language (IL) code in an assembly with a dll extension.
  • .deps.json file that contains all of the dependencies of the project.
  • .runtime.config.json file that specifies the shared runtime that the application expects, as well as other configuration options for the runtime (for example, garbage collection type).
  • The application's dependencies. These are copied from the NuGet cache into the output folder.
The dotnet publish command's output is ready for deployment to a hosting system (for example, a server, PC, Mac, laptop) for execution and is the only officially supported way to prepare the application for deployment. Depending on the type of deployment that the project specifies, the hosting system may or may not have the .NET Core shared runtime installed on it. For more information, see .NET Core Application Deployment. For the directory structure of a published application, see Directory structure.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetPublish(Configure configurator = null) + public static IReadOnlyCollection DotNetPublish(DotNetPublishSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetPublishSettings()); + toolSettings = toolSettings ?? new DotNetPublishSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

dotnet publish compiles the application, reads through its dependencies specified in the project file, and publishes the resulting set of files to a directory. The output will contain the following:

  • Intermediate Language (IL) code in an assembly with a dll extension.
  • .deps.json file that contains all of the dependencies of the project.
  • .runtime.config.json file that specifies the shared runtime that the application expects, as well as other configuration options for the runtime (for example, garbage collection type).
  • The application's dependencies. These are copied from the NuGet cache into the output folder.
The dotnet publish command's output is ready for deployment to a hosting system (for example, a server, PC, Mac, laptop) for execution and is the only officially supported way to prepare the application for deployment. Depending on the type of deployment that the project specifies, the hosting system may or may not have the .NET Core shared runtime installed on it. For more information, see .NET Core Application Deployment. For the directory structure of a published application, see Directory structure.

For more details, visit the official website.

+ public static IReadOnlyCollection DotNetPublish(Configure configurator) + { + return DotNetPublish(configurator(new DotNetPublishSettings())); + } + ///

dotnet publish compiles the application, reads through its dependencies specified in the project file, and publishes the resulting set of files to a directory. The output will contain the following:

  • Intermediate Language (IL) code in an assembly with a dll extension.
  • .deps.json file that contains all of the dependencies of the project.
  • .runtime.config.json file that specifies the shared runtime that the application expects, as well as other configuration options for the runtime (for example, garbage collection type).
  • The application's dependencies. These are copied from the NuGet cache into the output folder.
The dotnet publish command's output is ready for deployment to a hosting system (for example, a server, PC, Mac, laptop) for execution and is the only officially supported way to prepare the application for deployment. Depending on the type of deployment that the project specifies, the hosting system may or may not have the .NET Core shared runtime installed on it. For more information, see .NET Core Application Deployment. For the directory structure of a published application, see Directory structure.

For more details, visit the official website.

+ public static IEnumerable<(DotNetPublishSettings Settings, IReadOnlyCollection Output)> DotNetPublish(MultiplexConfigure configurator) + { + return configurator(new DotNetPublishSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetPublish(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Pushes a package to the server and publishes it.

For more details, visit the official website.

- public static IReadOnlyCollection DotNetNuGetPush(Configure configurator = null) + public static IReadOnlyCollection DotNetNuGetPush(DotNetNuGetPushSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DotNetNuGetPushSettings()); + toolSettings = toolSettings ?? new DotNetNuGetPushSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Pushes a package to the server and publishes it.

For more details, visit the official website.

+ public static IReadOnlyCollection DotNetNuGetPush(Configure configurator) + { + return DotNetNuGetPush(configurator(new DotNetNuGetPushSettings())); + } + ///

Pushes a package to the server and publishes it.

For more details, visit the official website.

+ public static IEnumerable<(DotNetNuGetPushSettings Settings, IReadOnlyCollection Output)> DotNetNuGetPush(MultiplexConfigure configurator) + { + return configurator(new DotNetNuGetPushSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DotNetNuGetPush(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region DotNetTestSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/DupFinder/DupFinder.Generated.cs b/source/Nuke.Common/Tools/DupFinder/DupFinder.Generated.cs index c0c80049f..57cb9790c 100644 --- a/source/Nuke.Common/Tools/DupFinder/DupFinder.Generated.cs +++ b/source/Nuke.Common/Tools/DupFinder/DupFinder.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection DupFinder(string arguments, string wor return process.Output; } ///

dupFinder is a free command line tool that finds duplicates in C# and Visual Basic .NET code - no more, no less. But being a JetBrains tool, dupFinder does it in a smart way. By default, it considers code fragments as duplicates not only if they are identical, but also if they are structurally similar, even if they contain different variables, fields, methods, types or literals. Of course, you can configure the allowed similarity as well as the minimum relative size of duplicated fragments.

For more details, visit the official website.

- public static IReadOnlyCollection DupFinder(Configure configurator = null) + public static IReadOnlyCollection DupFinder(DupFinderSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new DupFinderSettings()); + toolSettings = toolSettings ?? new DupFinderSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

dupFinder is a free command line tool that finds duplicates in C# and Visual Basic .NET code - no more, no less. But being a JetBrains tool, dupFinder does it in a smart way. By default, it considers code fragments as duplicates not only if they are identical, but also if they are structurally similar, even if they contain different variables, fields, methods, types or literals. Of course, you can configure the allowed similarity as well as the minimum relative size of duplicated fragments.

For more details, visit the official website.

+ public static IReadOnlyCollection DupFinder(Configure configurator) + { + return DupFinder(configurator(new DupFinderSettings())); + } + ///

dupFinder is a free command line tool that finds duplicates in C# and Visual Basic .NET code - no more, no less. But being a JetBrains tool, dupFinder does it in a smart way. By default, it considers code fragments as duplicates not only if they are identical, but also if they are structurally similar, even if they contain different variables, fields, methods, types or literals. Of course, you can configure the allowed similarity as well as the minimum relative size of duplicated fragments.

For more details, visit the official website.

+ public static IEnumerable<(DupFinderSettings Settings, IReadOnlyCollection Output)> DupFinder(MultiplexConfigure configurator) + { + return configurator(new DupFinderSettings()) + .Select(x => (ToolSettings: x, ReturnValue: DupFinder(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region DupFinderSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/GitLink/GitLink.Generated.cs b/source/Nuke.Common/Tools/GitLink/GitLink.Generated.cs index fe7e7f852..3d0d7fc47 100644 --- a/source/Nuke.Common/Tools/GitLink/GitLink.Generated.cs +++ b/source/Nuke.Common/Tools/GitLink/GitLink.Generated.cs @@ -35,23 +35,47 @@ public static IReadOnlyCollection GitLink(string arguments, string worki return process.Output; } ///

GitLink makes symbol servers obsolete which saves you both time with uploading source files with symbols and the user no longer has to specify custom symbol servers (such as symbolsource.org). The advantage of GitLink is that it is fully customized for Git. It also works with GitHub or BitBucket urls so it does not require a local git repository to work. This makes it perfectly usable in continuous integration servers such as Continua CI. Updating all the pdb files is very fast. A solution with over 85 projects will be handled in less than 30 seconds. When using GitLink, the user no longer has to specify symbol servers. The only requirement is to ensure the check the Enable source server support option in Visual Studio.

For more details, visit the official website.

- public static IReadOnlyCollection GitLink2(Configure configurator = null) + public static IReadOnlyCollection GitLink2(GitLink2Settings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new GitLink2Settings()); + toolSettings = toolSettings ?? new GitLink2Settings(); PreProcess(ref toolSettings); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

GitLink makes symbol servers obsolete which saves you both time with uploading source files with symbols and the user no longer has to specify custom symbol servers (such as symbolsource.org). The advantage of GitLink is that it is fully customized for Git. It also works with GitHub or BitBucket urls so it does not require a local git repository to work. This makes it perfectly usable in continuous integration servers such as Continua CI. Updating all the pdb files is very fast. A solution with over 85 projects will be handled in less than 30 seconds. When using GitLink, the user no longer has to specify symbol servers. The only requirement is to ensure the check the Enable source server support option in Visual Studio.

For more details, visit the official website.

- public static IReadOnlyCollection GitLink3(Configure configurator = null) + public static IReadOnlyCollection GitLink2(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new GitLink3Settings()); + return GitLink2(configurator(new GitLink2Settings())); + } + ///

GitLink makes symbol servers obsolete which saves you both time with uploading source files with symbols and the user no longer has to specify custom symbol servers (such as symbolsource.org). The advantage of GitLink is that it is fully customized for Git. It also works with GitHub or BitBucket urls so it does not require a local git repository to work. This makes it perfectly usable in continuous integration servers such as Continua CI. Updating all the pdb files is very fast. A solution with over 85 projects will be handled in less than 30 seconds. When using GitLink, the user no longer has to specify symbol servers. The only requirement is to ensure the check the Enable source server support option in Visual Studio.

For more details, visit the official website.

+ public static IEnumerable<(GitLink2Settings Settings, IReadOnlyCollection Output)> GitLink2(MultiplexConfigure configurator) + { + return configurator(new GitLink2Settings()) + .Select(x => (ToolSettings: x, ReturnValue: GitLink2(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

GitLink makes symbol servers obsolete which saves you both time with uploading source files with symbols and the user no longer has to specify custom symbol servers (such as symbolsource.org). The advantage of GitLink is that it is fully customized for Git. It also works with GitHub or BitBucket urls so it does not require a local git repository to work. This makes it perfectly usable in continuous integration servers such as Continua CI. Updating all the pdb files is very fast. A solution with over 85 projects will be handled in less than 30 seconds. When using GitLink, the user no longer has to specify symbol servers. The only requirement is to ensure the check the Enable source server support option in Visual Studio.

For more details, visit the official website.

+ public static IReadOnlyCollection GitLink3(GitLink3Settings toolSettings = null) + { + toolSettings = toolSettings ?? new GitLink3Settings(); PreProcess(ref toolSettings); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

GitLink makes symbol servers obsolete which saves you both time with uploading source files with symbols and the user no longer has to specify custom symbol servers (such as symbolsource.org). The advantage of GitLink is that it is fully customized for Git. It also works with GitHub or BitBucket urls so it does not require a local git repository to work. This makes it perfectly usable in continuous integration servers such as Continua CI. Updating all the pdb files is very fast. A solution with over 85 projects will be handled in less than 30 seconds. When using GitLink, the user no longer has to specify symbol servers. The only requirement is to ensure the check the Enable source server support option in Visual Studio.

For more details, visit the official website.

+ public static IReadOnlyCollection GitLink3(Configure configurator) + { + return GitLink3(configurator(new GitLink3Settings())); + } + ///

GitLink makes symbol servers obsolete which saves you both time with uploading source files with symbols and the user no longer has to specify custom symbol servers (such as symbolsource.org). The advantage of GitLink is that it is fully customized for Git. It also works with GitHub or BitBucket urls so it does not require a local git repository to work. This makes it perfectly usable in continuous integration servers such as Continua CI. Updating all the pdb files is very fast. A solution with over 85 projects will be handled in less than 30 seconds. When using GitLink, the user no longer has to specify symbol servers. The only requirement is to ensure the check the Enable source server support option in Visual Studio.

For more details, visit the official website.

+ public static IEnumerable<(GitLink3Settings Settings, IReadOnlyCollection Output)> GitLink3(MultiplexConfigure configurator) + { + return configurator(new GitLink3Settings()) + .Select(x => (ToolSettings: x, ReturnValue: GitLink3(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region GitLink2Settings ///

Used within .

diff --git a/source/Nuke.Common/Tools/GitReleaseManager/GitReleaseManager.Generated.cs b/source/Nuke.Common/Tools/GitReleaseManager/GitReleaseManager.Generated.cs index 2c4f08685..fd241ea9f 100644 --- a/source/Nuke.Common/Tools/GitReleaseManager/GitReleaseManager.Generated.cs +++ b/source/Nuke.Common/Tools/GitReleaseManager/GitReleaseManager.Generated.cs @@ -35,45 +35,105 @@ public static IReadOnlyCollection GitReleaseManager(string arguments, st return process.Output; } ///

Adds an asset to an existing release.

For more details, visit the official website.

- public static IReadOnlyCollection GitReleaseManagerAddAssets(Configure configurator = null) + public static IReadOnlyCollection GitReleaseManagerAddAssets(GitReleaseManagerAddAssetsSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new GitReleaseManagerAddAssetsSettings()); + toolSettings = toolSettings ?? new GitReleaseManagerAddAssetsSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Adds an asset to an existing release.

For more details, visit the official website.

+ public static IReadOnlyCollection GitReleaseManagerAddAssets(Configure configurator) + { + return GitReleaseManagerAddAssets(configurator(new GitReleaseManagerAddAssetsSettings())); + } + ///

Adds an asset to an existing release.

For more details, visit the official website.

+ public static IEnumerable<(GitReleaseManagerAddAssetsSettings Settings, IReadOnlyCollection Output)> GitReleaseManagerAddAssets(MultiplexConfigure configurator) + { + return configurator(new GitReleaseManagerAddAssetsSettings()) + .Select(x => (ToolSettings: x, ReturnValue: GitReleaseManagerAddAssets(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Closes the milestone.

For more details, visit the official website.

- public static IReadOnlyCollection GitReleaseManagerClose(Configure configurator = null) + public static IReadOnlyCollection GitReleaseManagerClose(GitReleaseManagerCloseSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new GitReleaseManagerCloseSettings()); + toolSettings = toolSettings ?? new GitReleaseManagerCloseSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Closes the milestone.

For more details, visit the official website.

+ public static IReadOnlyCollection GitReleaseManagerClose(Configure configurator) + { + return GitReleaseManagerClose(configurator(new GitReleaseManagerCloseSettings())); + } + ///

Closes the milestone.

For more details, visit the official website.

+ public static IEnumerable<(GitReleaseManagerCloseSettings Settings, IReadOnlyCollection Output)> GitReleaseManagerClose(MultiplexConfigure configurator) + { + return configurator(new GitReleaseManagerCloseSettings()) + .Select(x => (ToolSettings: x, ReturnValue: GitReleaseManagerClose(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Creates a draft release notes from a milestone.

For more details, visit the official website.

- public static IReadOnlyCollection GitReleaseManagerCreate(Configure configurator = null) + public static IReadOnlyCollection GitReleaseManagerCreate(GitReleaseManagerCreateSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new GitReleaseManagerCreateSettings()); + toolSettings = toolSettings ?? new GitReleaseManagerCreateSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Creates a draft release notes from a milestone.

For more details, visit the official website.

+ public static IReadOnlyCollection GitReleaseManagerCreate(Configure configurator) + { + return GitReleaseManagerCreate(configurator(new GitReleaseManagerCreateSettings())); + } + ///

Creates a draft release notes from a milestone.

For more details, visit the official website.

+ public static IEnumerable<(GitReleaseManagerCreateSettings Settings, IReadOnlyCollection Output)> GitReleaseManagerCreate(MultiplexConfigure configurator) + { + return configurator(new GitReleaseManagerCreateSettings()) + .Select(x => (ToolSettings: x, ReturnValue: GitReleaseManagerCreate(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Exports all the Release Notes in markdown format.

For more details, visit the official website.

- public static IReadOnlyCollection GitReleaseManagerExport(Configure configurator = null) + public static IReadOnlyCollection GitReleaseManagerExport(GitReleaseManagerExportSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new GitReleaseManagerExportSettings()); + toolSettings = toolSettings ?? new GitReleaseManagerExportSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Exports all the Release Notes in markdown format.

For more details, visit the official website.

+ public static IReadOnlyCollection GitReleaseManagerExport(Configure configurator) + { + return GitReleaseManagerExport(configurator(new GitReleaseManagerExportSettings())); + } + ///

Exports all the Release Notes in markdown format.

For more details, visit the official website.

+ public static IEnumerable<(GitReleaseManagerExportSettings Settings, IReadOnlyCollection Output)> GitReleaseManagerExport(MultiplexConfigure configurator) + { + return configurator(new GitReleaseManagerExportSettings()) + .Select(x => (ToolSettings: x, ReturnValue: GitReleaseManagerExport(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Publishes the GitHub Release.

For more details, visit the official website.

- public static IReadOnlyCollection GitReleaseManagerPublish(Configure configurator = null) + public static IReadOnlyCollection GitReleaseManagerPublish(GitReleaseManagerPublishSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new GitReleaseManagerPublishSettings()); + toolSettings = toolSettings ?? new GitReleaseManagerPublishSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Publishes the GitHub Release.

For more details, visit the official website.

+ public static IReadOnlyCollection GitReleaseManagerPublish(Configure configurator) + { + return GitReleaseManagerPublish(configurator(new GitReleaseManagerPublishSettings())); + } + ///

Publishes the GitHub Release.

For more details, visit the official website.

+ public static IEnumerable<(GitReleaseManagerPublishSettings Settings, IReadOnlyCollection Output)> GitReleaseManagerPublish(MultiplexConfigure configurator) + { + return configurator(new GitReleaseManagerPublishSettings()) + .Select(x => (ToolSettings: x, ReturnValue: GitReleaseManagerPublish(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region GitReleaseManagerAddAssetsSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/GitVersion/GitVersion.Generated.cs b/source/Nuke.Common/Tools/GitVersion/GitVersion.Generated.cs index 228c8638a..f6d6db5a9 100644 --- a/source/Nuke.Common/Tools/GitVersion/GitVersion.Generated.cs +++ b/source/Nuke.Common/Tools/GitVersion/GitVersion.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection GitVersion(string arguments, string wo return process.Output; } ///

GitVersion is a tool to help you achieve Semantic Versioning on your project.

For more details, visit the official website.

- public static (GitVersion Result, IReadOnlyCollection Output) GitVersion(Configure configurator = null) + public static (GitVersion Result, IReadOnlyCollection Output) GitVersion(GitVersionSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new GitVersionSettings()); + toolSettings = toolSettings ?? new GitVersionSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return (GetResult(process, toolSettings), process.Output); } + ///

GitVersion is a tool to help you achieve Semantic Versioning on your project.

For more details, visit the official website.

+ public static (GitVersion Result, IReadOnlyCollection Output) GitVersion(Configure configurator) + { + return GitVersion(configurator(new GitVersionSettings())); + } + ///

GitVersion is a tool to help you achieve Semantic Versioning on your project.

For more details, visit the official website.

+ public static IEnumerable<(GitVersionSettings Settings, GitVersion Result, IReadOnlyCollection Output)> GitVersion(MultiplexConfigure configurator) + { + return configurator(new GitVersionSettings()) + .Select(x => (ToolSettings: x, ReturnValue: GitVersion(x))) + .Select(x => (x.ToolSettings, x.ReturnValue.Result, x.ReturnValue.Output)).ToList(); + } } #region GitVersionSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/InspectCode/InspectCode.Generated.cs b/source/Nuke.Common/Tools/InspectCode/InspectCode.Generated.cs index d4adaa575..9e071a4f6 100644 --- a/source/Nuke.Common/Tools/InspectCode/InspectCode.Generated.cs +++ b/source/Nuke.Common/Tools/InspectCode/InspectCode.Generated.cs @@ -35,9 +35,9 @@ public static IReadOnlyCollection InspectCode(string arguments, string w return process.Output; } ///

One of ReSharper's most notable features, code inspection, is available even without opening Visual Studio. InspectCode, a free command line tool requires a minimum of one parameter- your solution file- to apply all of ReSharper's inspections.

For more details, visit the official website.

- public static IReadOnlyCollection InspectCode(Configure configurator = null) + public static IReadOnlyCollection InspectCode(InspectCodeSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new InspectCodeSettings()); + toolSettings = toolSettings ?? new InspectCodeSettings(); PreProcess(ref toolSettings); var process = StartProcess(toolSettings); process.AssertZeroExitCode(); @@ -45,16 +45,16 @@ public static IReadOnlyCollection InspectCode(Configure

One of ReSharper's most notable features, code inspection, is available even without opening Visual Studio. InspectCode, a free command line tool requires a minimum of one parameter- your solution file- to apply all of ReSharper's inspections.

For more details, visit the official website.

- public static IReadOnlyCollection InspectCode(string targetPath, Configure configurator = null) + public static IReadOnlyCollection InspectCode(Configure configurator) { - configurator = configurator ?? (x => x); - return InspectCode(x => configurator(x).SetTargetPath(targetPath)); + return InspectCode(configurator(new InspectCodeSettings())); } ///

One of ReSharper's most notable features, code inspection, is available even without opening Visual Studio. InspectCode, a free command line tool requires a minimum of one parameter- your solution file- to apply all of ReSharper's inspections.

For more details, visit the official website.

- public static IReadOnlyCollection InspectCode(string targetPath, string output, Configure configurator = null) + public static IEnumerable<(InspectCodeSettings Settings, IReadOnlyCollection Output)> InspectCode(MultiplexConfigure configurator) { - configurator = configurator ?? (x => x); - return InspectCode(targetPath, x => configurator(x).SetOutput(output)); + return configurator(new InspectCodeSettings()) + .Select(x => (ToolSettings: x, ReturnValue: InspectCode(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } } #region InspectCodeSettings diff --git a/source/Nuke.Common/Tools/MSBuild/MSBuild.Generated.cs b/source/Nuke.Common/Tools/MSBuild/MSBuild.Generated.cs index c314f57e7..9bf95ae3d 100644 --- a/source/Nuke.Common/Tools/MSBuild/MSBuild.Generated.cs +++ b/source/Nuke.Common/Tools/MSBuild/MSBuild.Generated.cs @@ -35,18 +35,24 @@ public static IReadOnlyCollection MSBuild(string arguments, string worki return process.Output; } ///

The Microsoft Build Engine is a platform for building applications. This engine, which is also known as MSBuild, provides an XML schema for a project file that controls how the build platform processes and builds software. Visual Studio uses MSBuild, but it doesn't depend on Visual Studio. By invoking msbuild.exe on your project or solution file, you can orchestrate and build products in environments where Visual Studio isn't installed. Visual Studio uses MSBuild to load and build managed projects. The project files in Visual Studio (.csproj,.vbproj, vcxproj, and others) contain MSBuild XML code that executes when you build a project by using the IDE. Visual Studio projects import all the necessary settings and build processes to do typical development work, but you can extend or modify them from within Visual Studio or by using an XML editor.

For more details, visit the official website.

- public static IReadOnlyCollection MSBuild(Configure configurator = null) + public static IReadOnlyCollection MSBuild(MSBuildSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new MSBuildSettings()); + toolSettings = toolSettings ?? new MSBuildSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The Microsoft Build Engine is a platform for building applications. This engine, which is also known as MSBuild, provides an XML schema for a project file that controls how the build platform processes and builds software. Visual Studio uses MSBuild, but it doesn't depend on Visual Studio. By invoking msbuild.exe on your project or solution file, you can orchestrate and build products in environments where Visual Studio isn't installed. Visual Studio uses MSBuild to load and build managed projects. The project files in Visual Studio (.csproj,.vbproj, vcxproj, and others) contain MSBuild XML code that executes when you build a project by using the IDE. Visual Studio projects import all the necessary settings and build processes to do typical development work, but you can extend or modify them from within Visual Studio or by using an XML editor.

For more details, visit the official website.

- public static IReadOnlyCollection MSBuild(string targetPath, Configure configurator = null) + public static IReadOnlyCollection MSBuild(Configure configurator) { - configurator = configurator ?? (x => x); - return MSBuild(x => configurator(x).SetTargetPath(targetPath)); + return MSBuild(configurator(new MSBuildSettings())); + } + ///

The Microsoft Build Engine is a platform for building applications. This engine, which is also known as MSBuild, provides an XML schema for a project file that controls how the build platform processes and builds software. Visual Studio uses MSBuild, but it doesn't depend on Visual Studio. By invoking msbuild.exe on your project or solution file, you can orchestrate and build products in environments where Visual Studio isn't installed. Visual Studio uses MSBuild to load and build managed projects. The project files in Visual Studio (.csproj,.vbproj, vcxproj, and others) contain MSBuild XML code that executes when you build a project by using the IDE. Visual Studio projects import all the necessary settings and build processes to do typical development work, but you can extend or modify them from within Visual Studio or by using an XML editor.

For more details, visit the official website.

+ public static IEnumerable<(MSBuildSettings Settings, IReadOnlyCollection Output)> MSBuild(MultiplexConfigure configurator) + { + return configurator(new MSBuildSettings()) + .Select(x => (ToolSettings: x, ReturnValue: MSBuild(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } } #region MSBuildSettings diff --git a/source/Nuke.Common/Tools/MSpec/MSpec.Generated.cs b/source/Nuke.Common/Tools/MSpec/MSpec.Generated.cs index e2ba9c5cc..63bf17e46 100644 --- a/source/Nuke.Common/Tools/MSpec/MSpec.Generated.cs +++ b/source/Nuke.Common/Tools/MSpec/MSpec.Generated.cs @@ -35,18 +35,24 @@ public static IReadOnlyCollection MSpec(string arguments, string working return process.Output; } ///

MSpec is called a 'context/specification' test framework because of the 'grammar' that is used in describing and coding the tests or 'specs'.

For more details, visit the official website.

- public static IReadOnlyCollection MSpec(Configure configurator = null) + public static IReadOnlyCollection MSpec(MSpecSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new MSpecSettings()); + toolSettings = toolSettings ?? new MSpecSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

MSpec is called a 'context/specification' test framework because of the 'grammar' that is used in describing and coding the tests or 'specs'.

For more details, visit the official website.

- public static IReadOnlyCollection MSpec(List assemblies, Configure configurator = null) + public static IReadOnlyCollection MSpec(Configure configurator) { - configurator = configurator ?? (x => x); - return MSpec(x => configurator(x).SetAssemblies(assemblies)); + return MSpec(configurator(new MSpecSettings())); + } + ///

MSpec is called a 'context/specification' test framework because of the 'grammar' that is used in describing and coding the tests or 'specs'.

For more details, visit the official website.

+ public static IEnumerable<(MSpecSettings Settings, IReadOnlyCollection Output)> MSpec(MultiplexConfigure configurator) + { + return configurator(new MSpecSettings()) + .Select(x => (ToolSettings: x, ReturnValue: MSpec(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } } #region MSpecSettings diff --git a/source/Nuke.Common/Tools/Npm/Npm.Generated.cs b/source/Nuke.Common/Tools/Npm/Npm.Generated.cs index 50db1e5c9..c9465aca3 100644 --- a/source/Nuke.Common/Tools/Npm/Npm.Generated.cs +++ b/source/Nuke.Common/Tools/Npm/Npm.Generated.cs @@ -35,21 +35,45 @@ public static IReadOnlyCollection Npm(string arguments, string workingDi return process.Output; } ///

Installs a package, and any packages that it depends on. If the package has a package-lock or shrinkwrap file, the installation of dependencies will be driven by that, with an npm-shrinkwrap.json taking precedence if both files exist. See package-lock.json and npm-shrinkwrap.A package is:

  • a) A folder containing a program described by a package.json file
  • b) A gzipped tarball containing (b)
  • c) A url that resolves to (b)
  • d) a <name>@<version> that is published on the registry (see npm-registry) with (c)
  • e) a <name>@<tag> (see npm-dist-tag) that points to (d)
  • f) a <name> that has a "latest" tag satisfying (e)
  • g) a <git remote url> that resolves to (a)

For more details, visit the official website.

- public static IReadOnlyCollection NpmInstall(Configure configurator = null) + public static IReadOnlyCollection NpmInstall(NpmInstallSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new NpmInstallSettings()); + toolSettings = toolSettings ?? new NpmInstallSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Installs a package, and any packages that it depends on. If the package has a package-lock or shrinkwrap file, the installation of dependencies will be driven by that, with an npm-shrinkwrap.json taking precedence if both files exist. See package-lock.json and npm-shrinkwrap.A package is:

  • a) A folder containing a program described by a package.json file
  • b) A gzipped tarball containing (b)
  • c) A url that resolves to (b)
  • d) a <name>@<version> that is published on the registry (see npm-registry) with (c)
  • e) a <name>@<tag> (see npm-dist-tag) that points to (d)
  • f) a <name> that has a "latest" tag satisfying (e)
  • g) a <git remote url> that resolves to (a)

For more details, visit the official website.

+ public static IReadOnlyCollection NpmInstall(Configure configurator) + { + return NpmInstall(configurator(new NpmInstallSettings())); + } + ///

Installs a package, and any packages that it depends on. If the package has a package-lock or shrinkwrap file, the installation of dependencies will be driven by that, with an npm-shrinkwrap.json taking precedence if both files exist. See package-lock.json and npm-shrinkwrap.A package is:

  • a) A folder containing a program described by a package.json file
  • b) A gzipped tarball containing (b)
  • c) A url that resolves to (b)
  • d) a <name>@<version> that is published on the registry (see npm-registry) with (c)
  • e) a <name>@<tag> (see npm-dist-tag) that points to (d)
  • f) a <name> that has a "latest" tag satisfying (e)
  • g) a <git remote url> that resolves to (a)

For more details, visit the official website.

+ public static IEnumerable<(NpmInstallSettings Settings, IReadOnlyCollection Output)> NpmInstall(MultiplexConfigure configurator) + { + return configurator(new NpmInstallSettings()) + .Select(x => (ToolSettings: x, ReturnValue: NpmInstall(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Runs an arbitrary command from a package's "scripts" object. If no "command" is provided, it will list the available scripts. run[-script] is used by the test, start, restart, and stop commands, but can be called directly, as well. When the scripts in the package are printed out, they're separated into lifecycle (test, start, restart) and directly-run scripts."

For more details, visit the official website.

- public static IReadOnlyCollection NpmRun(Configure configurator = null) + public static IReadOnlyCollection NpmRun(NpmRunSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new NpmRunSettings()); + toolSettings = toolSettings ?? new NpmRunSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Runs an arbitrary command from a package's "scripts" object. If no "command" is provided, it will list the available scripts. run[-script] is used by the test, start, restart, and stop commands, but can be called directly, as well. When the scripts in the package are printed out, they're separated into lifecycle (test, start, restart) and directly-run scripts."

For more details, visit the official website.

+ public static IReadOnlyCollection NpmRun(Configure configurator) + { + return NpmRun(configurator(new NpmRunSettings())); + } + ///

Runs an arbitrary command from a package's "scripts" object. If no "command" is provided, it will list the available scripts. run[-script] is used by the test, start, restart, and stop commands, but can be called directly, as well. When the scripts in the package are printed out, they're separated into lifecycle (test, start, restart) and directly-run scripts."

For more details, visit the official website.

+ public static IEnumerable<(NpmRunSettings Settings, IReadOnlyCollection Output)> NpmRun(MultiplexConfigure configurator) + { + return configurator(new NpmRunSettings()) + .Select(x => (ToolSettings: x, ReturnValue: NpmRun(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region NpmInstallSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/NuGet/NuGet.Generated.cs b/source/Nuke.Common/Tools/NuGet/NuGet.Generated.cs index e0883e02b..0e68f53a2 100644 --- a/source/Nuke.Common/Tools/NuGet/NuGet.Generated.cs +++ b/source/Nuke.Common/Tools/NuGet/NuGet.Generated.cs @@ -35,46 +35,64 @@ public static IReadOnlyCollection NuGet(string arguments, string working return process.Output; } ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

- public static IReadOnlyCollection NuGetPush(Configure configurator = null) + public static IReadOnlyCollection NuGetPush(NuGetPushSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new NuGetPushSettings()); + toolSettings = toolSettings ?? new NuGetPushSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

- public static IReadOnlyCollection NuGetPack(Configure configurator = null) + public static IReadOnlyCollection NuGetPush(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new NuGetPackSettings()); + return NuGetPush(configurator(new NuGetPushSettings())); + } + ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

+ public static IEnumerable<(NuGetPushSettings Settings, IReadOnlyCollection Output)> NuGetPush(MultiplexConfigure configurator) + { + return configurator(new NuGetPushSettings()) + .Select(x => (ToolSettings: x, ReturnValue: NuGetPush(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

+ public static IReadOnlyCollection NuGetPack(NuGetPackSettings toolSettings = null) + { + toolSettings = toolSettings ?? new NuGetPackSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

- public static IReadOnlyCollection NuGetPack(string targetPath, Configure configurator = null) + public static IReadOnlyCollection NuGetPack(Configure configurator) { - configurator = configurator ?? (x => x); - return NuGetPack(x => configurator(x).SetTargetPath(targetPath)); + return NuGetPack(configurator(new NuGetPackSettings())); } ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

- public static IReadOnlyCollection NuGetPack(string targetPath, string version, Configure configurator = null) + public static IEnumerable<(NuGetPackSettings Settings, IReadOnlyCollection Output)> NuGetPack(MultiplexConfigure configurator) { - configurator = configurator ?? (x => x); - return NuGetPack(targetPath, x => configurator(x).SetVersion(version)); + return configurator(new NuGetPackSettings()) + .Select(x => (ToolSettings: x, ReturnValue: NuGetPack(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

- public static IReadOnlyCollection NuGetRestore(Configure configurator = null) + public static IReadOnlyCollection NuGetRestore(NuGetRestoreSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new NuGetRestoreSettings()); + toolSettings = toolSettings ?? new NuGetRestoreSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

- public static IReadOnlyCollection NuGetRestore(string targetPath, Configure configurator = null) + public static IReadOnlyCollection NuGetRestore(Configure configurator) + { + return NuGetRestore(configurator(new NuGetRestoreSettings())); + } + ///

The NuGet Command Line Interface (CLI) provides the full extent of NuGet functionality to install, create, publish, and manage packages.

For more details, visit the official website.

+ public static IEnumerable<(NuGetRestoreSettings Settings, IReadOnlyCollection Output)> NuGetRestore(MultiplexConfigure configurator) { - configurator = configurator ?? (x => x); - return NuGetRestore(x => configurator(x).SetTargetPath(targetPath)); + return configurator(new NuGetRestoreSettings()) + .Select(x => (ToolSettings: x, ReturnValue: NuGetRestore(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } } #region NuGetPushSettings diff --git a/source/Nuke.Common/Tools/Nunit/Nunit3.Generated.cs b/source/Nuke.Common/Tools/Nunit/Nunit3.Generated.cs index 6b798b9ff..b2980cf9c 100644 --- a/source/Nuke.Common/Tools/Nunit/Nunit3.Generated.cs +++ b/source/Nuke.Common/Tools/Nunit/Nunit3.Generated.cs @@ -35,18 +35,24 @@ public static IReadOnlyCollection Nunit(string arguments, string working return process.Output; } ///

NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 3.0, has been completely rewritten with many new features and support for a wide range of .NET platforms.

For more details, visit the official website.

- public static IReadOnlyCollection Nunit3(Configure configurator = null) + public static IReadOnlyCollection Nunit3(Nunit3Settings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new Nunit3Settings()); + toolSettings = toolSettings ?? new Nunit3Settings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 3.0, has been completely rewritten with many new features and support for a wide range of .NET platforms.

For more details, visit the official website.

- public static IReadOnlyCollection Nunit3(List inputFiles, Configure configurator = null) + public static IReadOnlyCollection Nunit3(Configure configurator) { - configurator = configurator ?? (x => x); - return Nunit3(x => configurator(x).SetInputFiles(inputFiles)); + return Nunit3(configurator(new Nunit3Settings())); + } + ///

NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 3.0, has been completely rewritten with many new features and support for a wide range of .NET platforms.

For more details, visit the official website.

+ public static IEnumerable<(Nunit3Settings Settings, IReadOnlyCollection Output)> Nunit3(MultiplexConfigure configurator) + { + return configurator(new Nunit3Settings()) + .Select(x => (ToolSettings: x, ReturnValue: Nunit3(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); } } #region Nunit3Settings diff --git a/source/Nuke.Common/Tools/Octopus/Octopus.Generated.cs b/source/Nuke.Common/Tools/Octopus/Octopus.Generated.cs index 1336bd020..a5674a100 100644 --- a/source/Nuke.Common/Tools/Octopus/Octopus.Generated.cs +++ b/source/Nuke.Common/Tools/Octopus/Octopus.Generated.cs @@ -35,37 +35,85 @@ public static IReadOnlyCollection Octopus(string arguments, string worki return process.Output; } ///

The Octo.exe pack command provides a number of other useful parameters that can be used to customize the way your package gets created, such as output folder, files to include and release notes.

For more details, visit the official website.

- public static IReadOnlyCollection OctopusPack(Configure configurator = null) + public static IReadOnlyCollection OctopusPack(OctopusPackSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new OctopusPackSettings()); + toolSettings = toolSettings ?? new OctopusPackSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

The Octo.exe pack command provides a number of other useful parameters that can be used to customize the way your package gets created, such as output folder, files to include and release notes.

For more details, visit the official website.

+ public static IReadOnlyCollection OctopusPack(Configure configurator) + { + return OctopusPack(configurator(new OctopusPackSettings())); + } + ///

The Octo.exe pack command provides a number of other useful parameters that can be used to customize the way your package gets created, such as output folder, files to include and release notes.

For more details, visit the official website.

+ public static IEnumerable<(OctopusPackSettings Settings, IReadOnlyCollection Output)> OctopusPack(MultiplexConfigure configurator) + { + return configurator(new OctopusPackSettings()) + .Select(x => (ToolSettings: x, ReturnValue: OctopusPack(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

The Octo.exe push command can push any of the supported packages types listed on this page.

For more details, visit the official website.

- public static IReadOnlyCollection OctopusPush(Configure configurator = null) + public static IReadOnlyCollection OctopusPush(OctopusPushSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new OctopusPushSettings()); + toolSettings = toolSettings ?? new OctopusPushSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

The Octo.exe push command can push any of the supported packages types listed on this page.

For more details, visit the official website.

+ public static IReadOnlyCollection OctopusPush(Configure configurator) + { + return OctopusPush(configurator(new OctopusPushSettings())); + } + ///

The Octo.exe push command can push any of the supported packages types listed on this page.

For more details, visit the official website.

+ public static IEnumerable<(OctopusPushSettings Settings, IReadOnlyCollection Output)> OctopusPush(MultiplexConfigure configurator) + { + return configurator(new OctopusPushSettings()) + .Select(x => (ToolSettings: x, ReturnValue: OctopusPush(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

The Octo.exe create-release can be used to automate the creation of releases. This allows you to easily integrate Octopus with other continuous integration servers.

For more details, visit the official website.

- public static IReadOnlyCollection OctopusCreateRelease(Configure configurator = null) + public static IReadOnlyCollection OctopusCreateRelease(OctopusCreateReleaseSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new OctopusCreateReleaseSettings()); + toolSettings = toolSettings ?? new OctopusCreateReleaseSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

The Octo.exe create-release can be used to automate the creation of releases. This allows you to easily integrate Octopus with other continuous integration servers.

For more details, visit the official website.

+ public static IReadOnlyCollection OctopusCreateRelease(Configure configurator) + { + return OctopusCreateRelease(configurator(new OctopusCreateReleaseSettings())); + } + ///

The Octo.exe create-release can be used to automate the creation of releases. This allows you to easily integrate Octopus with other continuous integration servers.

For more details, visit the official website.

+ public static IEnumerable<(OctopusCreateReleaseSettings Settings, IReadOnlyCollection Output)> OctopusCreateRelease(MultiplexConfigure configurator) + { + return configurator(new OctopusCreateReleaseSettings()) + .Select(x => (ToolSettings: x, ReturnValue: OctopusCreateRelease(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

The Octo.exe deploy-release can be used to automate the deployment of releases to environments. This allows you to easily integrate Octopus with other continuous integration servers.

For more details, visit the official website.

- public static IReadOnlyCollection OctopusDeployRelease(Configure configurator = null) + public static IReadOnlyCollection OctopusDeployRelease(OctopusDeployReleaseSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new OctopusDeployReleaseSettings()); + toolSettings = toolSettings ?? new OctopusDeployReleaseSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

The Octo.exe deploy-release can be used to automate the deployment of releases to environments. This allows you to easily integrate Octopus with other continuous integration servers.

For more details, visit the official website.

+ public static IReadOnlyCollection OctopusDeployRelease(Configure configurator) + { + return OctopusDeployRelease(configurator(new OctopusDeployReleaseSettings())); + } + ///

The Octo.exe deploy-release can be used to automate the deployment of releases to environments. This allows you to easily integrate Octopus with other continuous integration servers.

For more details, visit the official website.

+ public static IEnumerable<(OctopusDeployReleaseSettings Settings, IReadOnlyCollection Output)> OctopusDeployRelease(MultiplexConfigure configurator) + { + return configurator(new OctopusDeployReleaseSettings()) + .Select(x => (ToolSettings: x, ReturnValue: OctopusDeployRelease(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region OctopusPackSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/OpenCover/OpenCover.Generated.cs b/source/Nuke.Common/Tools/OpenCover/OpenCover.Generated.cs index f86c08624..6b9d1fca5 100644 --- a/source/Nuke.Common/Tools/OpenCover/OpenCover.Generated.cs +++ b/source/Nuke.Common/Tools/OpenCover/OpenCover.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection OpenCover(string arguments, string wor return process.Output; } ///

OpenCover is a code coverage tool for .NET 2 and above (Windows OSs only - no MONO), with support for 32 and 64 processes and covers both branch and sequence points.

For more details, visit the official website.

- public static IReadOnlyCollection OpenCover(Configure configurator = null) + public static IReadOnlyCollection OpenCover(OpenCoverSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new OpenCoverSettings()); + toolSettings = toolSettings ?? new OpenCoverSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

OpenCover is a code coverage tool for .NET 2 and above (Windows OSs only - no MONO), with support for 32 and 64 processes and covers both branch and sequence points.

For more details, visit the official website.

+ public static IReadOnlyCollection OpenCover(Configure configurator) + { + return OpenCover(configurator(new OpenCoverSettings())); + } + ///

OpenCover is a code coverage tool for .NET 2 and above (Windows OSs only - no MONO), with support for 32 and 64 processes and covers both branch and sequence points.

For more details, visit the official website.

+ public static IEnumerable<(OpenCoverSettings Settings, IReadOnlyCollection Output)> OpenCover(MultiplexConfigure configurator) + { + return configurator(new OpenCoverSettings()) + .Select(x => (ToolSettings: x, ReturnValue: OpenCover(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region OpenCoverSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/Paket/Paket.Generated.cs b/source/Nuke.Common/Tools/Paket/Paket.Generated.cs index dfbe36d3c..042ebc1b7 100644 --- a/source/Nuke.Common/Tools/Paket/Paket.Generated.cs +++ b/source/Nuke.Common/Tools/Paket/Paket.Generated.cs @@ -35,37 +35,85 @@ public static IReadOnlyCollection Paket(string arguments, string working return process.Output; } ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

- public static IReadOnlyCollection PaketUpdate(Configure configurator = null) + public static IReadOnlyCollection PaketUpdate(PaketUpdateSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new PaketUpdateSettings()); + toolSettings = toolSettings ?? new PaketUpdateSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

- public static IReadOnlyCollection PaketRestore(Configure configurator = null) + public static IReadOnlyCollection PaketUpdate(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new PaketRestoreSettings()); + return PaketUpdate(configurator(new PaketUpdateSettings())); + } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IEnumerable<(PaketUpdateSettings Settings, IReadOnlyCollection Output)> PaketUpdate(MultiplexConfigure configurator) + { + return configurator(new PaketUpdateSettings()) + .Select(x => (ToolSettings: x, ReturnValue: PaketUpdate(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IReadOnlyCollection PaketRestore(PaketRestoreSettings toolSettings = null) + { + toolSettings = toolSettings ?? new PaketRestoreSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

- public static IReadOnlyCollection PaketPush(Configure configurator = null) + public static IReadOnlyCollection PaketRestore(Configure configurator) + { + return PaketRestore(configurator(new PaketRestoreSettings())); + } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IEnumerable<(PaketRestoreSettings Settings, IReadOnlyCollection Output)> PaketRestore(MultiplexConfigure configurator) + { + return configurator(new PaketRestoreSettings()) + .Select(x => (ToolSettings: x, ReturnValue: PaketRestore(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IReadOnlyCollection PaketPush(PaketPushSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new PaketPushSettings()); + toolSettings = toolSettings ?? new PaketPushSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

- public static IReadOnlyCollection PaketPack(Configure configurator = null) + public static IReadOnlyCollection PaketPush(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new PaketPackSettings()); + return PaketPush(configurator(new PaketPushSettings())); + } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IEnumerable<(PaketPushSettings Settings, IReadOnlyCollection Output)> PaketPush(MultiplexConfigure configurator) + { + return configurator(new PaketPushSettings()) + .Select(x => (ToolSettings: x, ReturnValue: PaketPush(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IReadOnlyCollection PaketPack(PaketPackSettings toolSettings = null) + { + toolSettings = toolSettings ?? new PaketPackSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IReadOnlyCollection PaketPack(Configure configurator) + { + return PaketPack(configurator(new PaketPackSettings())); + } + ///

Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.

If you want to learn how to use Paket then read the Getting started tutorial and take a look at the FAQs.

If you are already using NuGet for package management in your solution then you can learn about the upgrade process in the convert from NuGet section.

For more details, visit the official website.

+ public static IEnumerable<(PaketPackSettings Settings, IReadOnlyCollection Output)> PaketPack(MultiplexConfigure configurator) + { + return configurator(new PaketPackSettings()) + .Select(x => (ToolSettings: x, ReturnValue: PaketPack(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region PaketUpdateSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/ReportGenerator/ReportGenerator.Generated.cs b/source/Nuke.Common/Tools/ReportGenerator/ReportGenerator.Generated.cs index af03288e4..6eca2ff3c 100644 --- a/source/Nuke.Common/Tools/ReportGenerator/ReportGenerator.Generated.cs +++ b/source/Nuke.Common/Tools/ReportGenerator/ReportGenerator.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection ReportGenerator(string arguments, stri return process.Output; } ///

ReportGenerator converts XML reports generated by OpenCover, PartCover, dotCover, Visual Studio, NCover or Cobertura into human readable reports in various formats.

The reports do not only show the coverage quota, but also include the source code and visualize which lines have been covered.

ReportGenerator supports merging several reports into one. It is also possible to pass one XML file containing several reports to ReportGenerator (e.g. a build log file).

The following output formats are supported by ReportGenerator:

  • HTML, HTMLSummary, HTMLInline, HTMLChart, MHTML
  • XML, XMLSummary
  • Latex, LatexSummary
  • TextSummary
  • CsvSummary
  • PngChart
  • Badges
  • Custom reports

Compatibility:

For more details, visit the official website.

- public static IReadOnlyCollection ReportGenerator(Configure configurator = null) + public static IReadOnlyCollection ReportGenerator(ReportGeneratorSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new ReportGeneratorSettings()); + toolSettings = toolSettings ?? new ReportGeneratorSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

ReportGenerator converts XML reports generated by OpenCover, PartCover, dotCover, Visual Studio, NCover or Cobertura into human readable reports in various formats.

The reports do not only show the coverage quota, but also include the source code and visualize which lines have been covered.

ReportGenerator supports merging several reports into one. It is also possible to pass one XML file containing several reports to ReportGenerator (e.g. a build log file).

The following output formats are supported by ReportGenerator:

  • HTML, HTMLSummary, HTMLInline, HTMLChart, MHTML
  • XML, XMLSummary
  • Latex, LatexSummary
  • TextSummary
  • CsvSummary
  • PngChart
  • Badges
  • Custom reports

Compatibility:

For more details, visit the official website.

+ public static IReadOnlyCollection ReportGenerator(Configure configurator) + { + return ReportGenerator(configurator(new ReportGeneratorSettings())); + } + ///

ReportGenerator converts XML reports generated by OpenCover, PartCover, dotCover, Visual Studio, NCover or Cobertura into human readable reports in various formats.

The reports do not only show the coverage quota, but also include the source code and visualize which lines have been covered.

ReportGenerator supports merging several reports into one. It is also possible to pass one XML file containing several reports to ReportGenerator (e.g. a build log file).

The following output formats are supported by ReportGenerator:

  • HTML, HTMLSummary, HTMLInline, HTMLChart, MHTML
  • XML, XMLSummary
  • Latex, LatexSummary
  • TextSummary
  • CsvSummary
  • PngChart
  • Badges
  • Custom reports

Compatibility:

For more details, visit the official website.

+ public static IEnumerable<(ReportGeneratorSettings Settings, IReadOnlyCollection Output)> ReportGenerator(MultiplexConfigure configurator) + { + return configurator(new ReportGeneratorSettings()) + .Select(x => (ToolSettings: x, ReturnValue: ReportGenerator(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region ReportGeneratorSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/SignTool/SignTool.Generated.cs b/source/Nuke.Common/Tools/SignTool/SignTool.Generated.cs index c57d0ddcc..0c9e7aa46 100644 --- a/source/Nuke.Common/Tools/SignTool/SignTool.Generated.cs +++ b/source/Nuke.Common/Tools/SignTool/SignTool.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection SignTool(string arguments, string work return process.Output; } ///

Use the sign command to sign files using embedded signatures. Signing protects a file from tampering, and allows users to verify the signer (you) based on a signing certificate. The options below allow you to specify signing parameters and to select the signing certificate you wish to use.

For more details, visit the official website.

- public static IReadOnlyCollection SignTool(Configure configurator = null) + public static IReadOnlyCollection SignTool(SignToolSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SignToolSettings()); + toolSettings = toolSettings ?? new SignToolSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Use the sign command to sign files using embedded signatures. Signing protects a file from tampering, and allows users to verify the signer (you) based on a signing certificate. The options below allow you to specify signing parameters and to select the signing certificate you wish to use.

For more details, visit the official website.

+ public static IReadOnlyCollection SignTool(Configure configurator) + { + return SignTool(configurator(new SignToolSettings())); + } + ///

Use the sign command to sign files using embedded signatures. Signing protects a file from tampering, and allows users to verify the signer (you) based on a signing certificate. The options below allow you to specify signing parameters and to select the signing certificate you wish to use.

For more details, visit the official website.

+ public static IEnumerable<(SignToolSettings Settings, IReadOnlyCollection Output)> SignTool(MultiplexConfigure configurator) + { + return configurator(new SignToolSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SignTool(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region SignToolSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/SonarScanner/SonarScanner.Generated.cs b/source/Nuke.Common/Tools/SonarScanner/SonarScanner.Generated.cs index 3b37a1c27..1d5a8dbc1 100644 --- a/source/Nuke.Common/Tools/SonarScanner/SonarScanner.Generated.cs +++ b/source/Nuke.Common/Tools/SonarScanner/SonarScanner.Generated.cs @@ -35,21 +35,45 @@ public static IReadOnlyCollection SonarScanner(string arguments, string return process.Output; } ///

The SonarScanner for MSBuild is the recommended way to launch a SonarQube or SonarCloud analysis for projects/solutions using MSBuild or dotnet command as build tool.

For more details, visit the official website.

- public static IReadOnlyCollection SonarScannerBegin(Configure configurator = null) + public static IReadOnlyCollection SonarScannerBegin(SonarScannerBeginSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SonarScannerBeginSettings()); + toolSettings = toolSettings ?? new SonarScannerBeginSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

The SonarScanner for MSBuild is the recommended way to launch a SonarQube or SonarCloud analysis for projects/solutions using MSBuild or dotnet command as build tool.

For more details, visit the official website.

- public static IReadOnlyCollection SonarScannerEnd(Configure configurator = null) + public static IReadOnlyCollection SonarScannerBegin(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new SonarScannerEndSettings()); + return SonarScannerBegin(configurator(new SonarScannerBeginSettings())); + } + ///

The SonarScanner for MSBuild is the recommended way to launch a SonarQube or SonarCloud analysis for projects/solutions using MSBuild or dotnet command as build tool.

For more details, visit the official website.

+ public static IEnumerable<(SonarScannerBeginSettings Settings, IReadOnlyCollection Output)> SonarScannerBegin(MultiplexConfigure configurator) + { + return configurator(new SonarScannerBeginSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SonarScannerBegin(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

The SonarScanner for MSBuild is the recommended way to launch a SonarQube or SonarCloud analysis for projects/solutions using MSBuild or dotnet command as build tool.

For more details, visit the official website.

+ public static IReadOnlyCollection SonarScannerEnd(SonarScannerEndSettings toolSettings = null) + { + toolSettings = toolSettings ?? new SonarScannerEndSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

The SonarScanner for MSBuild is the recommended way to launch a SonarQube or SonarCloud analysis for projects/solutions using MSBuild or dotnet command as build tool.

For more details, visit the official website.

+ public static IReadOnlyCollection SonarScannerEnd(Configure configurator) + { + return SonarScannerEnd(configurator(new SonarScannerEndSettings())); + } + ///

The SonarScanner for MSBuild is the recommended way to launch a SonarQube or SonarCloud analysis for projects/solutions using MSBuild or dotnet command as build tool.

For more details, visit the official website.

+ public static IEnumerable<(SonarScannerEndSettings Settings, IReadOnlyCollection Output)> SonarScannerEnd(MultiplexConfigure configurator) + { + return configurator(new SonarScannerEndSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SonarScannerEnd(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region SonarScannerBeginSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/SpecFlow/SpecFlow.Generated.cs b/source/Nuke.Common/Tools/SpecFlow/SpecFlow.Generated.cs index 2147ec436..96f074936 100644 --- a/source/Nuke.Common/Tools/SpecFlow/SpecFlow.Generated.cs +++ b/source/Nuke.Common/Tools/SpecFlow/SpecFlow.Generated.cs @@ -35,69 +35,165 @@ public static IReadOnlyCollection SpecFlow(string arguments, string work return process.Output; } ///

This report provides a formatted HTML report of a test execution. The report contains a summary about the executed tests and the result and also a detailed report for the individual scenario executions.

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowNUnitExecutionReport(Configure configurator = null) + public static IReadOnlyCollection SpecFlowNUnitExecutionReport(SpecFlowNUnitExecutionReportSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SpecFlowNUnitExecutionReportSettings()); + toolSettings = toolSettings ?? new SpecFlowNUnitExecutionReportSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } ///

This report provides a formatted HTML report of a test execution. The report contains a summary about the executed tests and the result and also a detailed report for the individual scenario executions.

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowMSTestExecutionReport(Configure configurator = null) + public static IReadOnlyCollection SpecFlowNUnitExecutionReport(Configure configurator) { - var toolSettings = configurator.InvokeSafe(new SpecFlowMSTestExecutionReportSettings()); + return SpecFlowNUnitExecutionReport(configurator(new SpecFlowNUnitExecutionReportSettings())); + } + ///

This report provides a formatted HTML report of a test execution. The report contains a summary about the executed tests and the result and also a detailed report for the individual scenario executions.

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowNUnitExecutionReportSettings Settings, IReadOnlyCollection Output)> SpecFlowNUnitExecutionReport(MultiplexConfigure configurator) + { + return configurator(new SpecFlowNUnitExecutionReportSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowNUnitExecutionReport(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } + ///

This report provides a formatted HTML report of a test execution. The report contains a summary about the executed tests and the result and also a detailed report for the individual scenario executions.

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowMSTestExecutionReport(SpecFlowMSTestExecutionReportSettings toolSettings = null) + { + toolSettings = toolSettings ?? new SpecFlowMSTestExecutionReportSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

This report provides a formatted HTML report of a test execution. The report contains a summary about the executed tests and the result and also a detailed report for the individual scenario executions.

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowMSTestExecutionReport(Configure configurator) + { + return SpecFlowMSTestExecutionReport(configurator(new SpecFlowMSTestExecutionReportSettings())); + } + ///

This report provides a formatted HTML report of a test execution. The report contains a summary about the executed tests and the result and also a detailed report for the individual scenario executions.

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowMSTestExecutionReportSettings Settings, IReadOnlyCollection Output)> SpecFlowMSTestExecutionReport(MultiplexConfigure configurator) + { + return configurator(new SpecFlowMSTestExecutionReportSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowMSTestExecutionReport(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

This report shows the usage and binding status of the steps for the entire project. You can use this report to find both unused code in the automation layer and scenario steps that have no definition yet.

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowStepDefinitionReport(Configure configurator = null) + public static IReadOnlyCollection SpecFlowStepDefinitionReport(SpecFlowStepDefinitionReportSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SpecFlowStepDefinitionReportSettings()); + toolSettings = toolSettings ?? new SpecFlowStepDefinitionReportSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

This report shows the usage and binding status of the steps for the entire project. You can use this report to find both unused code in the automation layer and scenario steps that have no definition yet.

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowStepDefinitionReport(Configure configurator) + { + return SpecFlowStepDefinitionReport(configurator(new SpecFlowStepDefinitionReportSettings())); + } + ///

This report shows the usage and binding status of the steps for the entire project. You can use this report to find both unused code in the automation layer and scenario steps that have no definition yet.

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowStepDefinitionReportSettings Settings, IReadOnlyCollection Output)> SpecFlowStepDefinitionReport(MultiplexConfigure configurator) + { + return configurator(new SpecFlowStepDefinitionReportSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowStepDefinitionReport(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Use SpecRun.exe run to execute your tests.

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowRun(Configure configurator = null) + public static IReadOnlyCollection SpecFlowRun(SpecFlowRunSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SpecFlowRunSettings()); + toolSettings = toolSettings ?? new SpecFlowRunSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Use SpecRun.exe run to execute your tests.

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowRun(Configure configurator) + { + return SpecFlowRun(configurator(new SpecFlowRunSettings())); + } + ///

Use SpecRun.exe run to execute your tests.

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowRunSettings Settings, IReadOnlyCollection Output)> SpecFlowRun(MultiplexConfigure configurator) + { + return configurator(new SpecFlowRunSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowRun(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Use SpecRun.exe buildserverrun to execute your tests in build server mode.

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowBuildServerRun(Configure configurator = null) + public static IReadOnlyCollection SpecFlowBuildServerRun(SpecFlowBuildServerRunSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SpecFlowBuildServerRunSettings()); + toolSettings = toolSettings ?? new SpecFlowBuildServerRunSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Use SpecRun.exe buildserverrun to execute your tests in build server mode.

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowBuildServerRun(Configure configurator) + { + return SpecFlowBuildServerRun(configurator(new SpecFlowBuildServerRunSettings())); + } + ///

Use SpecRun.exe buildserverrun to execute your tests in build server mode.

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowBuildServerRunSettings Settings, IReadOnlyCollection Output)> SpecFlowBuildServerRun(MultiplexConfigure configurator) + { + return configurator(new SpecFlowBuildServerRunSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowBuildServerRun(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Use SpecRun.exe register to register your SpecFlow+ license. You only need to register your license once per user per machine. The license is valid for all SpecFlow+ components.

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowRegister(Configure configurator = null) + public static IReadOnlyCollection SpecFlowRegister(SpecFlowRegisterSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SpecFlowRegisterSettings()); + toolSettings = toolSettings ?? new SpecFlowRegisterSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Use SpecRun.exe register to register your SpecFlow+ license. You only need to register your license once per user per machine. The license is valid for all SpecFlow+ components.

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowRegister(Configure configurator) + { + return SpecFlowRegister(configurator(new SpecFlowRegisterSettings())); + } + ///

Use SpecRun.exe register to register your SpecFlow+ license. You only need to register your license once per user per machine. The license is valid for all SpecFlow+ components.

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowRegisterSettings Settings, IReadOnlyCollection Output)> SpecFlowRegister(MultiplexConfigure configurator) + { + return configurator(new SpecFlowRegisterSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowRegister(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Use SpecRun.exe unregister to unregister your SpecFlow+ license.

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowUnregister(Configure configurator = null) + public static IReadOnlyCollection SpecFlowUnregister(SpecFlowUnregisterSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SpecFlowUnregisterSettings()); + toolSettings = toolSettings ?? new SpecFlowUnregisterSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Use SpecRun.exe unregister to unregister your SpecFlow+ license.

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowUnregister(Configure configurator) + { + return SpecFlowUnregister(configurator(new SpecFlowUnregisterSettings())); + } + ///

Use SpecRun.exe unregister to unregister your SpecFlow+ license.

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowUnregisterSettings Settings, IReadOnlyCollection Output)> SpecFlowUnregister(MultiplexConfigure configurator) + { + return configurator(new SpecFlowUnregisterSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowUnregister(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Use SpecRun.exe about to display information such as your version number, build date and license information (licensee, upgrade until date/expiry date).

For more details, visit the official website.

- public static IReadOnlyCollection SpecFlowAbout(Configure configurator = null) + public static IReadOnlyCollection SpecFlowAbout(SpecFlowAboutSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SpecFlowAboutSettings()); + toolSettings = toolSettings ?? new SpecFlowAboutSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Use SpecRun.exe about to display information such as your version number, build date and license information (licensee, upgrade until date/expiry date).

For more details, visit the official website.

+ public static IReadOnlyCollection SpecFlowAbout(Configure configurator) + { + return SpecFlowAbout(configurator(new SpecFlowAboutSettings())); + } + ///

Use SpecRun.exe about to display information such as your version number, build date and license information (licensee, upgrade until date/expiry date).

For more details, visit the official website.

+ public static IEnumerable<(SpecFlowAboutSettings Settings, IReadOnlyCollection Output)> SpecFlowAbout(MultiplexConfigure configurator) + { + return configurator(new SpecFlowAboutSettings()) + .Select(x => (ToolSettings: x, ReturnValue: SpecFlowAbout(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region SpecFlowNUnitExecutionReportSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/Squirrel/Squirrel.Generated.cs b/source/Nuke.Common/Tools/Squirrel/Squirrel.Generated.cs index a174fc100..ff0c8483c 100644 --- a/source/Nuke.Common/Tools/Squirrel/Squirrel.Generated.cs +++ b/source/Nuke.Common/Tools/Squirrel/Squirrel.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection Squirrel(string arguments, string work return process.Output; } ///

Squirrel is both a set of tools and a library, to completely manage both installation and updating your Desktop Windows application, written in either C# or any other language (i.e., Squirrel can manage native C++ applications).

For more details, visit the official website.

- public static IReadOnlyCollection Squirrel(Configure configurator = null) + public static IReadOnlyCollection Squirrel(SquirrelSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new SquirrelSettings()); + toolSettings = toolSettings ?? new SquirrelSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Squirrel is both a set of tools and a library, to completely manage both installation and updating your Desktop Windows application, written in either C# or any other language (i.e., Squirrel can manage native C++ applications).

For more details, visit the official website.

+ public static IReadOnlyCollection Squirrel(Configure configurator) + { + return Squirrel(configurator(new SquirrelSettings())); + } + ///

Squirrel is both a set of tools and a library, to completely manage both installation and updating your Desktop Windows application, written in either C# or any other language (i.e., Squirrel can manage native C++ applications).

For more details, visit the official website.

+ public static IEnumerable<(SquirrelSettings Settings, IReadOnlyCollection Output)> Squirrel(MultiplexConfigure configurator) + { + return configurator(new SquirrelSettings()) + .Select(x => (ToolSettings: x, ReturnValue: Squirrel(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region SquirrelSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/TestCloud/TestCloud.Generated.cs b/source/Nuke.Common/Tools/TestCloud/TestCloud.Generated.cs index d4801474b..36ab96883 100644 --- a/source/Nuke.Common/Tools/TestCloud/TestCloud.Generated.cs +++ b/source/Nuke.Common/Tools/TestCloud/TestCloud.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection TestCloud(string arguments, string wor return process.Output; } ///

Test Cloud is a cloud based service consisting of thousands of physical mobile devices. Users upload their apps and tests to Test Cloud, which will install the apps on the devices and run the tests. When the tests are complete, Test Cloud, the results made available to users through an easy to use and informative web-based front end.

For more details, visit the official website.

- public static IReadOnlyCollection TestCloud(Configure configurator = null) + public static IReadOnlyCollection TestCloud(TestCloudSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new TestCloudSettings()); + toolSettings = toolSettings ?? new TestCloudSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

Test Cloud is a cloud based service consisting of thousands of physical mobile devices. Users upload their apps and tests to Test Cloud, which will install the apps on the devices and run the tests. When the tests are complete, Test Cloud, the results made available to users through an easy to use and informative web-based front end.

For more details, visit the official website.

+ public static IReadOnlyCollection TestCloud(Configure configurator) + { + return TestCloud(configurator(new TestCloudSettings())); + } + ///

Test Cloud is a cloud based service consisting of thousands of physical mobile devices. Users upload their apps and tests to Test Cloud, which will install the apps on the devices and run the tests. When the tests are complete, Test Cloud, the results made available to users through an easy to use and informative web-based front end.

For more details, visit the official website.

+ public static IEnumerable<(TestCloudSettings Settings, IReadOnlyCollection Output)> TestCloud(MultiplexConfigure configurator) + { + return configurator(new TestCloudSettings()) + .Select(x => (ToolSettings: x, ReturnValue: TestCloud(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region TestCloudSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/Unity/Unity.Generated.cs b/source/Nuke.Common/Tools/Unity/Unity.Generated.cs index 08e8445d2..5e299611e 100644 --- a/source/Nuke.Common/Tools/Unity/Unity.Generated.cs +++ b/source/Nuke.Common/Tools/Unity/Unity.Generated.cs @@ -35,41 +35,89 @@ public static IReadOnlyCollection Unity(string arguments, string working return process.Output; } ///

(2018.2+) Exports the currently activated license to the path of the Unity executable or either the default Unity license location, see the logs or Activation FAQ for more information.

For more details, visit the official website.

- public static IReadOnlyCollection UnityCreateManualActivationFile(Configure configurator = null) + public static IReadOnlyCollection UnityCreateManualActivationFile(UnityCreateManualActivationFileSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new UnityCreateManualActivationFileSettings()); + toolSettings = toolSettings ?? new UnityCreateManualActivationFileSettings(); PreProcess(ref toolSettings); var process = StartProcess(toolSettings); AssertProcess(process, toolSettings); return process.Output; } + ///

(2018.2+) Exports the currently activated license to the path of the Unity executable or either the default Unity license location, see the logs or Activation FAQ for more information.

For more details, visit the official website.

+ public static IReadOnlyCollection UnityCreateManualActivationFile(Configure configurator) + { + return UnityCreateManualActivationFile(configurator(new UnityCreateManualActivationFileSettings())); + } + ///

(2018.2+) Exports the currently activated license to the path of the Unity executable or either the default Unity license location, see the logs or Activation FAQ for more information.

For more details, visit the official website.

+ public static IEnumerable<(UnityCreateManualActivationFileSettings Settings, IReadOnlyCollection Output)> UnityCreateManualActivationFile(MultiplexConfigure configurator) + { + return configurator(new UnityCreateManualActivationFileSettings()) + .Select(x => (ToolSettings: x, ReturnValue: UnityCreateManualActivationFile(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

(2018.2+) Activates Unity with a license file.

For more details, visit the official website.

- public static IReadOnlyCollection UnityManualLicenseFile(Configure configurator = null) + public static IReadOnlyCollection UnityManualLicenseFile(UnityManualLicenseFileSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new UnityManualLicenseFileSettings()); + toolSettings = toolSettings ?? new UnityManualLicenseFileSettings(); PreProcess(ref toolSettings); var process = StartProcess(toolSettings); AssertProcess(process, toolSettings); return process.Output; } + ///

(2018.2+) Activates Unity with a license file.

For more details, visit the official website.

+ public static IReadOnlyCollection UnityManualLicenseFile(Configure configurator) + { + return UnityManualLicenseFile(configurator(new UnityManualLicenseFileSettings())); + } + ///

(2018.2+) Activates Unity with a license file.

For more details, visit the official website.

+ public static IEnumerable<(UnityManualLicenseFileSettings Settings, IReadOnlyCollection Output)> UnityManualLicenseFile(MultiplexConfigure configurator) + { + return configurator(new UnityManualLicenseFileSettings()) + .Select(x => (ToolSettings: x, ReturnValue: UnityManualLicenseFile(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Execute Unity.

For more details, visit the official website.

- public static IReadOnlyCollection Unity(Configure configurator = null) + public static IReadOnlyCollection Unity(UnitySettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new UnitySettings()); + toolSettings = toolSettings ?? new UnitySettings(); PreProcess(ref toolSettings); var process = StartProcess(toolSettings); AssertProcess(process, toolSettings); return process.Output; } + ///

Execute Unity.

For more details, visit the official website.

+ public static IReadOnlyCollection Unity(Configure configurator) + { + return Unity(configurator(new UnitySettings())); + } + ///

Execute Unity.

For more details, visit the official website.

+ public static IEnumerable<(UnitySettings Settings, IReadOnlyCollection Output)> Unity(MultiplexConfigure configurator) + { + return configurator(new UnitySettings()) + .Select(x => (ToolSettings: x, ReturnValue: Unity(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } ///

Return the currenlty activated Unity license.

For more details, visit the official website.

- public static IReadOnlyCollection UnityReturnLicense(Configure configurator = null) + public static IReadOnlyCollection UnityReturnLicense(UnityReturnLicenseSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new UnityReturnLicenseSettings()); + toolSettings = toolSettings ?? new UnityReturnLicenseSettings(); PreProcess(ref toolSettings); var process = StartProcess(toolSettings); AssertProcess(process, toolSettings); return process.Output; } + ///

Return the currenlty activated Unity license.

For more details, visit the official website.

+ public static IReadOnlyCollection UnityReturnLicense(Configure configurator) + { + return UnityReturnLicense(configurator(new UnityReturnLicenseSettings())); + } + ///

Return the currenlty activated Unity license.

For more details, visit the official website.

+ public static IEnumerable<(UnityReturnLicenseSettings Settings, IReadOnlyCollection Output)> UnityReturnLicense(MultiplexConfigure configurator) + { + return configurator(new UnityReturnLicenseSettings()) + .Select(x => (ToolSettings: x, ReturnValue: UnityReturnLicense(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region UnityCreateManualActivationFileSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/VSTest/VSTest.Generated.cs b/source/Nuke.Common/Tools/VSTest/VSTest.Generated.cs index a635fa0b7..58ac1f1be 100644 --- a/source/Nuke.Common/Tools/VSTest/VSTest.Generated.cs +++ b/source/Nuke.Common/Tools/VSTest/VSTest.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection VSTest(string arguments, string workin return process.Output; } ///

VSTest.Console.exe is the command-line command that is used to run tests. You can specify several options in any order on the VSTest.Console.exe command line.

For more details, visit the official website.

- public static IReadOnlyCollection VSTest(Configure configurator = null) + public static IReadOnlyCollection VSTest(VSTestSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new VSTestSettings()); + toolSettings = toolSettings ?? new VSTestSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

VSTest.Console.exe is the command-line command that is used to run tests. You can specify several options in any order on the VSTest.Console.exe command line.

For more details, visit the official website.

+ public static IReadOnlyCollection VSTest(Configure configurator) + { + return VSTest(configurator(new VSTestSettings())); + } + ///

VSTest.Console.exe is the command-line command that is used to run tests. You can specify several options in any order on the VSTest.Console.exe command line.

For more details, visit the official website.

+ public static IEnumerable<(VSTestSettings Settings, IReadOnlyCollection Output)> VSTest(MultiplexConfigure configurator) + { + return configurator(new VSTestSettings()) + .Select(x => (ToolSettings: x, ReturnValue: VSTest(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region VSTestSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/VSWhere/VSWhere.Generated.cs b/source/Nuke.Common/Tools/VSWhere/VSWhere.Generated.cs index e43b9a833..1a5e40029 100644 --- a/source/Nuke.Common/Tools/VSWhere/VSWhere.Generated.cs +++ b/source/Nuke.Common/Tools/VSWhere/VSWhere.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection VSWhere(string arguments, string worki return process.Output; } ///

VSWhere is designed to be a redistributable, single-file executable that can be used in build or deployment scripts to find where Visual Studio - or other products in the Visual Studio family - is located.

For more details, visit the official website.

- public static (List Result, IReadOnlyCollection Output) VSWhere(Configure configurator = null) + public static (List Result, IReadOnlyCollection Output) VSWhere(VSWhereSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new VSWhereSettings()); + toolSettings = toolSettings ?? new VSWhereSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return (GetResult(process, toolSettings), process.Output); } + ///

VSWhere is designed to be a redistributable, single-file executable that can be used in build or deployment scripts to find where Visual Studio - or other products in the Visual Studio family - is located.

For more details, visit the official website.

+ public static (List Result, IReadOnlyCollection Output) VSWhere(Configure configurator) + { + return VSWhere(configurator(new VSWhereSettings())); + } + ///

VSWhere is designed to be a redistributable, single-file executable that can be used in build or deployment scripts to find where Visual Studio - or other products in the Visual Studio family - is located.

For more details, visit the official website.

+ public static IEnumerable<(VSWhereSettings Settings, List Result, IReadOnlyCollection Output)> VSWhere(MultiplexConfigure configurator) + { + return configurator(new VSWhereSettings()) + .Select(x => (ToolSettings: x, ReturnValue: VSWhere(x))) + .Select(x => (x.ToolSettings, x.ReturnValue.Result, x.ReturnValue.Output)).ToList(); + } } #region VSWhereSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/WebConfigTransformRunner/WebConfigTransformRunner.Generated.cs b/source/Nuke.Common/Tools/WebConfigTransformRunner/WebConfigTransformRunner.Generated.cs index 98e0060e7..67a0e710f 100644 --- a/source/Nuke.Common/Tools/WebConfigTransformRunner/WebConfigTransformRunner.Generated.cs +++ b/source/Nuke.Common/Tools/WebConfigTransformRunner/WebConfigTransformRunner.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection WebConfigTransformRunner(string argume return process.Output; } ///

This is a commandline tool to run an ASP.Net web.config tranformation.

For more details, visit the official website.

- public static IReadOnlyCollection WebConfigTransformRunner(Configure configurator = null) + public static IReadOnlyCollection WebConfigTransformRunner(WebConfigTransformRunnerSettings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new WebConfigTransformRunnerSettings()); + toolSettings = toolSettings ?? new WebConfigTransformRunnerSettings(); var process = ProcessTasks.StartProcess(toolSettings); process.AssertZeroExitCode(); return process.Output; } + ///

This is a commandline tool to run an ASP.Net web.config tranformation.

For more details, visit the official website.

+ public static IReadOnlyCollection WebConfigTransformRunner(Configure configurator) + { + return WebConfigTransformRunner(configurator(new WebConfigTransformRunnerSettings())); + } + ///

This is a commandline tool to run an ASP.Net web.config tranformation.

For more details, visit the official website.

+ public static IEnumerable<(WebConfigTransformRunnerSettings Settings, IReadOnlyCollection Output)> WebConfigTransformRunner(MultiplexConfigure configurator) + { + return configurator(new WebConfigTransformRunnerSettings()) + .Select(x => (ToolSettings: x, ReturnValue: WebConfigTransformRunner(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region WebConfigTransformRunnerSettings ///

Used within .

diff --git a/source/Nuke.Common/Tools/Xunit/Xunit.Generated.cs b/source/Nuke.Common/Tools/Xunit/Xunit.Generated.cs index 5b180bc70..28842a421 100644 --- a/source/Nuke.Common/Tools/Xunit/Xunit.Generated.cs +++ b/source/Nuke.Common/Tools/Xunit/Xunit.Generated.cs @@ -35,13 +35,25 @@ public static IReadOnlyCollection Xunit(string arguments, string working return process.Output; } ///

xUnit.net is a free, open source, community-focused unit testing tool for the .NET Framework. Written by the original inventor of NUnit v2, xUnit.net is the latest technology for unit testing C#, F#, VB.NET and other .NET languages. xUnit.net works with ReSharper, CodeRush, TestDriven.NET and Xamarin. It is part of the .NET Foundation, and operates under their code of conduct. It is licensed under Apache 2 (an OSI approved license).

For more details, visit the official website.

- public static IReadOnlyCollection Xunit2(Configure configurator = null) + public static IReadOnlyCollection Xunit2(Xunit2Settings toolSettings = null) { - var toolSettings = configurator.InvokeSafe(new Xunit2Settings()); + toolSettings = toolSettings ?? new Xunit2Settings(); var process = ProcessTasks.StartProcess(toolSettings); AssertProcess(process, toolSettings); return process.Output; } + ///

xUnit.net is a free, open source, community-focused unit testing tool for the .NET Framework. Written by the original inventor of NUnit v2, xUnit.net is the latest technology for unit testing C#, F#, VB.NET and other .NET languages. xUnit.net works with ReSharper, CodeRush, TestDriven.NET and Xamarin. It is part of the .NET Foundation, and operates under their code of conduct. It is licensed under Apache 2 (an OSI approved license).

For more details, visit the official website.

+ public static IReadOnlyCollection Xunit2(Configure configurator) + { + return Xunit2(configurator(new Xunit2Settings())); + } + ///

xUnit.net is a free, open source, community-focused unit testing tool for the .NET Framework. Written by the original inventor of NUnit v2, xUnit.net is the latest technology for unit testing C#, F#, VB.NET and other .NET languages. xUnit.net works with ReSharper, CodeRush, TestDriven.NET and Xamarin. It is part of the .NET Foundation, and operates under their code of conduct. It is licensed under Apache 2 (an OSI approved license).

For more details, visit the official website.

+ public static IEnumerable<(Xunit2Settings Settings, IReadOnlyCollection Output)> Xunit2(MultiplexConfigure configurator) + { + return configurator(new Xunit2Settings()) + .Select(x => (ToolSettings: x, ReturnValue: Xunit2(x))) + .Select(x => (x.ToolSettings, x.ReturnValue)).ToList(); + } } #region Xunit2Settings ///

Used within .

From f64ef0ef42bf70f1dcd23660cdd6d9343f0278e5 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 21:48:21 +0100 Subject: [PATCH 07/53] Add ProjectExtensions for GetProperty, GetItems and GetTargetFrameworks --- .../ProjectModel/ProjectExtensions.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/source/Nuke.Common/ProjectModel/ProjectExtensions.cs b/source/Nuke.Common/ProjectModel/ProjectExtensions.cs index f0e9a3a09..dd5c3f037 100644 --- a/source/Nuke.Common/ProjectModel/ProjectExtensions.cs +++ b/source/Nuke.Common/ProjectModel/ProjectExtensions.cs @@ -13,6 +13,7 @@ namespace Nuke.Common.ProjectModel { + [PublicAPI] public static class ProjectExtensions { private static void Initialize(string workingDirectory) @@ -64,6 +65,33 @@ public static Microsoft.Build.Evaluation.Project GetMSBuildProject( return msbuildProject; } + [CanBeNull] + public static string GetProperty(this Project project, string propertyName) + { + var property = project.GetMSBuildProject().GetProperty(propertyName); + return property?.EvaluatedValue; + } + + [CanBeNull] + public static IEnumerable GetItemIncludes(this Project project, string itemGroupName) + { + var items = project.GetMSBuildProject().GetItems(itemGroupName); + return items.Select(x => x.EvaluatedInclude); + } + + public static IReadOnlyCollection GetTargetFrameworks(this Microsoft.Build.Evaluation.Project project) + { + var targetFrameworkProperty = project.GetProperty("TargetFramework"); + if (targetFrameworkProperty != null) + return new[]{ targetFrameworkProperty.EvaluatedValue }; + + var targetFrameworksProperty = project.GetProperty("TargetFrameworks"); + if (targetFrameworksProperty != null) + return targetFrameworksProperty.EvaluatedValue.Split(';'); + + return new string[0]; + } + private static Dictionary GetProperties([CanBeNull] string configuration, [CanBeNull] string targetFramework) { var properties = new Dictionary(); From 78a37d595eda04e512fc27a617a7743888677688 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 01:25:48 +0100 Subject: [PATCH 08/53] Reimplement build execution --- build/Build.cs | 1 - shell-completion.yml | 6 + .../Execution/BuildExecutorTest.cs | 316 +++++++++--------- .../Execution/ExecutionTestUtility.cs | 122 +++---- .../Execution/NukeBuildAssertions.cs | 146 ++++---- .../Execution/TargetDefinitionLoaderTest.cs | 170 +++++----- source/Nuke.Common/Execution/BuildExecutor.cs | 305 ++--------------- .../Execution/BuildExtensionAttributeBase.cs | 17 +- .../Nuke.Common/Execution/BuildExtensions.cs | 45 --- source/Nuke.Common/Execution/BuildManager.cs | 175 ++++++++++ .../CheckPathEnvironmentVariableAttribute.cs | 5 +- .../Nuke.Common/Execution/ExecutableTarget.cs | 54 +++ .../Execution/ExecutableTargetFactory.cs | 63 ++++ .../Nuke.Common/Execution/ExecutionPlanner.cs | 115 +++++++ .../Nuke.Common/Execution/ExecutionStatus.cs | 2 +- source/Nuke.Common/Execution/GraphService.cs | 24 +- .../Execution/HandleHelpRequestsAttribute.cs | 11 +- .../HandleShellCompletionAttribute.cs | 7 +- .../HandleVisualStudioDebuggingAttribute.cs | 5 +- .../Nuke.Common/Execution/HelpTextService.cs | 16 +- .../Execution/RequirementService.cs | 4 +- .../Nuke.Common/Execution/TargetDefinition.cs | 67 ++-- .../Execution/TargetDefinitionLoader.cs | 149 --------- source/Nuke.Common/ITargetDefinition.cs | 15 + source/Nuke.Common/NukeBuild.Statics.cs | 17 +- source/Nuke.Common/NukeBuild.cs | 15 +- 26 files changed, 933 insertions(+), 939 deletions(-) create mode 100644 source/Nuke.Common/Execution/BuildManager.cs create mode 100644 source/Nuke.Common/Execution/ExecutableTarget.cs create mode 100644 source/Nuke.Common/Execution/ExecutableTargetFactory.cs create mode 100644 source/Nuke.Common/Execution/ExecutionPlanner.cs delete mode 100644 source/Nuke.Common/Execution/TargetDefinitionLoader.cs diff --git a/build/Build.cs b/build/Build.cs index 406d2c191..6bcbef09f 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -63,7 +63,6 @@ partial class Build : NukeBuild }); Target Restore => _ => _ - .DependsOn(Clean) .Executes(() => { DotNetRestore(s => s diff --git a/shell-completion.yml b/shell-completion.yml index bdc9f1d82..b850b8a09 100644 --- a/shell-completion.yml +++ b/shell-completion.yml @@ -17,7 +17,10 @@ Host: - Travis Root: Skip: +- A - Analysis +- B +- C - Changelog - Clean - Compile @@ -35,7 +38,10 @@ Solution: Source: SymbolSource: Target: +- A - Analysis +- B +- C - Changelog - Clean - Compile diff --git a/source/Nuke.Common.Tests/Execution/BuildExecutorTest.cs b/source/Nuke.Common.Tests/Execution/BuildExecutorTest.cs index 711abfc81..39f26d112 100644 --- a/source/Nuke.Common.Tests/Execution/BuildExecutorTest.cs +++ b/source/Nuke.Common.Tests/Execution/BuildExecutorTest.cs @@ -1,158 +1,158 @@ -// Copyright 2018 Maintainers of NUKE. -// Distributed under the MIT License. -// https://github.com/nuke-build/nuke/blob/master/LICENSE - -using System; -using System.Linq; -using FluentAssertions; -using FluentAssertions.Execution; -using Nuke.Common.Execution; -using Xunit; - -namespace Nuke.Common.Tests.Execution -{ - public class BuildExecutorTest - { - [Fact] - public void SkipAllTargetsWhenConditionFalseAndBehaviorSkip() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = false; - x.SwitchConditionInDependency = false; - x.DependencyBehavior = DependencyBehavior.Skip; - }); - - AssertExecutionStatus(build, ExecutionStatus.Skipped, ExecutionStatus.Skipped); - } - - [Fact] - public void SkipAllTargetsWhenConditionFalseAndBehaviorSkip_SwitchCondition() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = false; - x.SwitchConditionInDependency = true; - x.DependencyBehavior = DependencyBehavior.Skip; - }); - - AssertExecutionStatus(build, ExecutionStatus.Skipped, ExecutionStatus.Skipped); - } - - [Fact] - public void ExecuteAllTargetsWhenConditionTrueAndBehaviorSkip() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = true; - x.SwitchConditionInDependency = false; - x.DependencyBehavior = DependencyBehavior.Skip; - }); - - AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); - } - - [Fact] - public void ExecuteAllTargetsWhenConditionTrueAndBehaviorSkip_SwitchCondition() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = true; - x.SwitchConditionInDependency = true; - x.DependencyBehavior = DependencyBehavior.Skip; - }); - - AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); - } - - [Fact] - public void SkipExecuteTargetWhenConditionTrueAndBehaviorExecute_SwitchCondition() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = true; - x.SwitchConditionInDependency = true; - x.DependencyBehavior = DependencyBehavior.Execute; - }); - - AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Skipped); - } - - [Fact] - public void ExecuteAllTargetsWhenConditionTrueAndBehaviorExecute() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = true; - x.SwitchConditionInDependency = false; - x.DependencyBehavior = DependencyBehavior.Execute; - }); - - AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); - } - - [Fact] - public void ExecuteDependencyTargetWhenConditionFalseAndBehaviorExecute() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = false; - x.SwitchConditionInDependency = false; - x.DependencyBehavior = DependencyBehavior.Execute; - }); - - AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Skipped); - } - - [Fact] - public void ExecuteAllTargetsWhenConditionFalseAndBehaviorExecute_SwitchCondition() - { - var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, - x => - { - x.OnlyWhenCondition = false; - x.SwitchConditionInDependency = true; - x.DependencyBehavior = DependencyBehavior.Execute; - }); - - AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); - } - - [CustomAssertion] - private void AssertExecutionStatus(TestBuild build, ExecutionStatus dependencyTargetStatus, ExecutionStatus executeTargetStatus) - { - using (new AssertionScope()) - { - build.Should().HaveTargetWithExecutionStatus(x => x.Dependency, dependencyTargetStatus); - build.Should().HaveTargetWithExecutionStatus(x => x.Execute, executeTargetStatus); - } - } - - private class TestBuild : NukeBuild - { - public bool OnlyWhenCondition; - public bool SwitchConditionInDependency; - public DependencyBehavior DependencyBehavior = DependencyBehavior.Execute; - - public Target Dependency => _ => _ - .Executes(() => - { - if (SwitchConditionInDependency) - OnlyWhenCondition = !OnlyWhenCondition; - }); - - public Target Execute => _ => _ - .DependsOn(Dependency) - .OnlyWhen(() => OnlyWhenCondition) - .WhenSkipped(DependencyBehavior) - .Executes(() => { }); - } - } -} +// // Copyright 2018 Maintainers of NUKE. +// // Distributed under the MIT License. +// // https://github.com/nuke-build/nuke/blob/master/LICENSE +// +// using System; +// using System.Linq; +// using FluentAssertions; +// using FluentAssertions.Execution; +// using Nuke.Common.Execution; +// using Xunit; +// +// namespace Nuke.Common.Tests.Execution +// { +// public class BuildExecutorTest +// { +// [Fact] +// public void SkipAllTargetsWhenConditionFalseAndBehaviorSkip() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = false; +// x.SwitchConditionInDependency = false; +// x.DependencyBehavior = DependencyBehavior.Skip; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Skipped, ExecutionStatus.Skipped); +// } +// +// [Fact] +// public void SkipAllTargetsWhenConditionFalseAndBehaviorSkip_SwitchCondition() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = false; +// x.SwitchConditionInDependency = true; +// x.DependencyBehavior = DependencyBehavior.Skip; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Skipped, ExecutionStatus.Skipped); +// } +// +// [Fact] +// public void ExecuteAllTargetsWhenConditionTrueAndBehaviorSkip() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = true; +// x.SwitchConditionInDependency = false; +// x.DependencyBehavior = DependencyBehavior.Skip; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); +// } +// +// [Fact] +// public void ExecuteAllTargetsWhenConditionTrueAndBehaviorSkip_SwitchCondition() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = true; +// x.SwitchConditionInDependency = true; +// x.DependencyBehavior = DependencyBehavior.Skip; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); +// } +// +// [Fact] +// public void SkipExecuteTargetWhenConditionTrueAndBehaviorExecute_SwitchCondition() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = true; +// x.SwitchConditionInDependency = true; +// x.DependencyBehavior = DependencyBehavior.Execute; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Skipped); +// } +// +// [Fact] +// public void ExecuteAllTargetsWhenConditionTrueAndBehaviorExecute() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = true; +// x.SwitchConditionInDependency = false; +// x.DependencyBehavior = DependencyBehavior.Execute; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); +// } +// +// [Fact] +// public void ExecuteDependencyTargetWhenConditionFalseAndBehaviorExecute() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = false; +// x.SwitchConditionInDependency = false; +// x.DependencyBehavior = DependencyBehavior.Execute; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Skipped); +// } +// +// [Fact] +// public void ExecuteAllTargetsWhenConditionFalseAndBehaviorExecute_SwitchCondition() +// { +// var build = ExecutionTestUtility.CreateBuildAndExecuteDefaultTarget(x => x.Execute, +// x => +// { +// x.OnlyWhenCondition = false; +// x.SwitchConditionInDependency = true; +// x.DependencyBehavior = DependencyBehavior.Execute; +// }); +// +// AssertExecutionStatus(build, ExecutionStatus.Executed, ExecutionStatus.Executed); +// } +// +// [CustomAssertion] +// private void AssertExecutionStatus(TestBuild build, ExecutionStatus dependencyTargetStatus, ExecutionStatus executeTargetStatus) +// { +// using (new AssertionScope()) +// { +// build.Should().HaveTargetWithExecutionStatus(x => x.Dependency, dependencyTargetStatus); +// build.Should().HaveTargetWithExecutionStatus(x => x.Execute, executeTargetStatus); +// } +// } +// +// private class TestBuild : NukeBuild +// { +// public bool OnlyWhenCondition; +// public bool SwitchConditionInDependency; +// public DependencyBehavior DependencyBehavior = DependencyBehavior.Execute; +// +// public Target Dependency => _ => _ +// .Executes(() => +// { +// if (SwitchConditionInDependency) +// OnlyWhenCondition = !OnlyWhenCondition; +// }); +// +// public Target Execute => _ => _ +// .DependsOn(Dependency) +// .OnlyWhen(() => OnlyWhenCondition) +// .WhenSkipped(DependencyBehavior) +// .Executes(() => { }); +// } +// } +// } diff --git a/source/Nuke.Common.Tests/Execution/ExecutionTestUtility.cs b/source/Nuke.Common.Tests/Execution/ExecutionTestUtility.cs index 42189f8f7..12b8ed3d9 100644 --- a/source/Nuke.Common.Tests/Execution/ExecutionTestUtility.cs +++ b/source/Nuke.Common.Tests/Execution/ExecutionTestUtility.cs @@ -1,61 +1,61 @@ -// Copyright 2018 Maintainers of NUKE. -// Distributed under the MIT License. -// https://github.com/nuke-build/nuke/blob/master/LICENSE - -using System; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using Nuke.Common.Execution; - -namespace Nuke.Common.Tests.Execution -{ - internal static class ExecutionTestUtility - { - public static T CreateBuild(string defaultTarget = null, Action configure = null) - where T : NukeBuild - { - if (string.IsNullOrEmpty(defaultTarget)) - { - defaultTarget = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public) - .First(x => x.PropertyType == typeof(Target)).Name; - } - - var targetExpression = CreateTargetExpressionByTargetName(defaultTarget); - return CreateBuild(targetExpression, configure); - } - - public static T CreateBuild(Expression> defaultTargetExpression, Action configure = null) - where T : NukeBuild - { - var instance = Activator.CreateInstance(); - configure?.Invoke(instance); - instance.TargetDefinitions = instance.GetTargetDefinitions(defaultTargetExpression); - return instance; - } - - public static T CreateBuildAndExecuteDefaultTarget(Expression> targetExpression, Action configure = null) - where T : NukeBuild - { - var build = CreateBuild(targetExpression, configure); - ExecuteDefaultTarget(build); - return build; - } - - public static void ExecuteDefaultTarget(T build) - where T : NukeBuild - { - var invokedTargetNames = new[] { BuildExecutor.DefaultTarget }; - var executingTargets = TargetDefinitionLoader.GetExecutingTargets(build, invokedTargetNames, skippedTargetNames: null); - BuildExecutor.Execute(build, executingTargets); - } - - private static Expression> CreateTargetExpressionByTargetName(string target) - where T : NukeBuild - { - var param = Expression.Parameter(typeof(T)); - var body = Expression.PropertyOrField(param, target); - return Expression.Lambda>(body, param); - } - } -} +// // Copyright 2018 Maintainers of NUKE. +// // Distributed under the MIT License. +// // https://github.com/nuke-build/nuke/blob/master/LICENSE +// +// using System; +// using System.Linq; +// using System.Linq.Expressions; +// using System.Reflection; +// using Nuke.Common.Execution; +// +// namespace Nuke.Common.Tests.Execution +// { +// internal static class ExecutionTestUtility +// { +// public static T CreateBuild(string defaultTarget = null, Action configure = null) +// where T : NukeBuild +// { +// if (string.IsNullOrEmpty(defaultTarget)) +// { +// defaultTarget = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public) +// .First(x => x.PropertyType == typeof(Target)).Name; +// } +// +// var targetExpression = CreateTargetExpressionByTargetName(defaultTarget); +// return CreateBuild(targetExpression, configure); +// } +// +// public static T CreateBuild(Expression> defaultTargetExpression, Action configure = null) +// where T : NukeBuild +// { +// var instance = Activator.CreateInstance(); +// configure?.Invoke(instance); +// instance.TargetDefinitions = instance.GetTargetDefinitions(defaultTargetExpression); +// return instance; +// } +// +// public static T CreateBuildAndExecuteDefaultTarget(Expression> targetExpression, Action configure = null) +// where T : NukeBuild +// { +// var build = CreateBuild(targetExpression, configure); +// ExecuteDefaultTarget(build); +// return build; +// } +// +// public static void ExecuteDefaultTarget(T build) +// where T : NukeBuild +// { +// var invokedTargetNames = new[] { BuildExecutor.DefaultTarget }; +// var executingTargets = TargetDefinitionLoader.GetExecutingTargets(build, invokedTargetNames, skippedTargetNames: null); +// BuildExecutor.Execute(build, executingTargets); +// } +// +// private static Expression> CreateTargetExpressionByTargetName(string target) +// where T : NukeBuild +// { +// var param = Expression.Parameter(typeof(T)); +// var body = Expression.PropertyOrField(param, target); +// return Expression.Lambda>(body, param); +// } +// } +// } diff --git a/source/Nuke.Common.Tests/Execution/NukeBuildAssertions.cs b/source/Nuke.Common.Tests/Execution/NukeBuildAssertions.cs index 6344e19e4..9398ae381 100644 --- a/source/Nuke.Common.Tests/Execution/NukeBuildAssertions.cs +++ b/source/Nuke.Common.Tests/Execution/NukeBuildAssertions.cs @@ -1,73 +1,73 @@ -// Copyright 2018 Maintainers of NUKE. -// Distributed under the MIT License. -// https://github.com/nuke-build/nuke/blob/master/LICENSE - -using System; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using FluentAssertions; -using FluentAssertions.Execution; -using FluentAssertions.Primitives; -using Nuke.Common.Execution; - -namespace Nuke.Common.Tests.Execution -{ - internal class NukeBuildAssertions : ReferenceTypeAssertions - { - public NukeBuildAssertions(NukeBuild subject) - { - Subject = subject; - } - - [CustomAssertion] - public AndConstraint HaveTargetWithExecutionStatus( - Expression> targetSelector, - ExecutionStatus status, - string because = null, - params object[] becauseArgs) - where T : NukeBuild - { - var member = targetSelector.Body as MemberExpression; - var prop = member?.Member as PropertyInfo; - var name = prop?.Name; - - return HaveTargetWithExecutionStatus(name, status, because, becauseArgs); - } - - [CustomAssertion] - public AndConstraint HaveTargetWithExecutionStatus( - string targetName, - ExecutionStatus expectedStatus, - string because = null, - params object[] becauseArgs) - { - var target = Subject.TargetDefinitions.SingleOrDefault(x => x.Name == targetName); - - Execute.Assertion - .BecauseOf(because, becauseArgs) - .ForCondition(target != null) - .FailWith("Expected {context:build} to have a target with the name {0}{reason}, but found {1}.", - targetName, - Subject.TargetDefinitions.Select(x => x.Name)) - .Then - .ForCondition(target.Status == expectedStatus) - .FailWith("Expected {context:build} to have a target with the name {0} and status {1}{reason}, but found status {2}.", - targetName, - expectedStatus, - target.Status); - - return new AndConstraint(this); - } - - protected override string Identifier => "nukeBuild"; - } - - internal static class NukeBuildAssertionExtensions - { - public static NukeBuildAssertions Should(this NukeBuild build) - { - return new NukeBuildAssertions(build); - } - } -} +// // Copyright 2018 Maintainers of NUKE. +// // Distributed under the MIT License. +// // https://github.com/nuke-build/nuke/blob/master/LICENSE +// +// using System; +// using System.Linq; +// using System.Linq.Expressions; +// using System.Reflection; +// using FluentAssertions; +// using FluentAssertions.Execution; +// using FluentAssertions.Primitives; +// using Nuke.Common.Execution; +// +// namespace Nuke.Common.Tests.Execution +// { +// internal class NukeBuildAssertions : ReferenceTypeAssertions +// { +// public NukeBuildAssertions(NukeBuild subject) +// { +// Subject = subject; +// } +// +// [CustomAssertion] +// public AndConstraint HaveTargetWithExecutionStatus( +// Expression> targetSelector, +// ExecutionStatus status, +// string because = null, +// params object[] becauseArgs) +// where T : NukeBuild +// { +// var member = targetSelector.Body as MemberExpression; +// var prop = member?.Member as PropertyInfo; +// var name = prop?.Name; +// +// return HaveTargetWithExecutionStatus(name, status, because, becauseArgs); +// } +// +// [CustomAssertion] +// public AndConstraint HaveTargetWithExecutionStatus( +// string targetName, +// ExecutionStatus expectedStatus, +// string because = null, +// params object[] becauseArgs) +// { +// var target = Subject.TargetDefinitions.SingleOrDefault(x => x.Name == targetName); +// +// Execute.Assertion +// .BecauseOf(because, becauseArgs) +// .ForCondition(target != null) +// .FailWith("Expected {context:build} to have a target with the name {0}{reason}, but found {1}.", +// targetName, +// Subject.TargetDefinitions.Select(x => x.Name)) +// .Then +// .ForCondition(target.Status == expectedStatus) +// .FailWith("Expected {context:build} to have a target with the name {0} and status {1}{reason}, but found status {2}.", +// targetName, +// expectedStatus, +// target.Status); +// +// return new AndConstraint(this); +// } +// +// protected override string Identifier => "nukeBuild"; +// } +// +// internal static class NukeBuildAssertionExtensions +// { +// public static NukeBuildAssertions Should(this NukeBuild build) +// { +// return new NukeBuildAssertions(build); +// } +// } +// } diff --git a/source/Nuke.Common.Tests/Execution/TargetDefinitionLoaderTest.cs b/source/Nuke.Common.Tests/Execution/TargetDefinitionLoaderTest.cs index ab13ca125..c9945c9e1 100644 --- a/source/Nuke.Common.Tests/Execution/TargetDefinitionLoaderTest.cs +++ b/source/Nuke.Common.Tests/Execution/TargetDefinitionLoaderTest.cs @@ -1,85 +1,85 @@ -// Copyright 2018 Maintainers of NUKE. -// Distributed under the MIT License. -// https://github.com/nuke-build/nuke/blob/master/LICENSE - -using System; -using System.Linq; -using FluentAssertions; -using Nuke.Common.Execution; -using Xunit; - -namespace Nuke.Common.Tests.Execution -{ - public class TargetDefinitionLoaderTest - { - [Theory] - [InlineData( - new[] { nameof(TestBuild.Execute) }, - new[] { nameof(TestBuild.Dependency), nameof(TestBuild.Execute) })] - [InlineData( - new[] { nameof(TestBuild.ExecuteSkipDependencies) }, - new string[0])] - [InlineData( - new[] { nameof(TestBuild.ExecuteImplicitExecuteDependencies) }, - new[] { nameof(TestBuild.Dependency) })] - [InlineData( - new[] { nameof(TestBuild.ExecuteExplicitExecuteDependencies) }, - new[] { nameof(TestBuild.Dependency) })] - [InlineData( - new[] { nameof(TestBuild.ExecuteSkipDependencies), nameof(TestBuild.ExecuteImplicitExecuteDependencies) }, - new[] { nameof(TestBuild.Dependency) })] - [InlineData( - new[] { nameof(TestBuild.Execute), nameof(TestBuild.ExecuteDependency1SkipDependencies) }, - new[] { nameof(TestBuild.Dependency), nameof(TestBuild.Execute) })] - [InlineData( - new[] { nameof(TestBuild.ExecuteSkipDependencies), nameof(TestBuild.Dependency) }, - new[] { nameof(TestBuild.Dependency) })] - public void Test(string[] invokedTargetNames, string[] expectedTargets) - { - TargetDefinitionLoader.GetExecutingTargets( - ExecutionTestUtility.CreateBuild(), - invokedTargetNames, - skippedTargetNames: null) - .Where(x => !x.Skip && x.Conditions.All(y => y())) - .Select(x => x.Name) - .Should().BeEquivalentTo(expectedTargets); - } - - internal class TestBuild : NukeBuild - { - public Target Dependency => _ => _ - .Executes(() => { }); - - public Target Dependency1 => _ => _ - .DependsOn(Dependency) - .Executes(() => { }); - - public Target ExecuteSkipDependencies => _ => _ - .DependsOn(Dependency) - .OnlyWhen(() => false) - .WhenSkipped(DependencyBehavior.Skip) - .Executes(() => { }); - - public Target ExecuteImplicitExecuteDependencies => _ => _ - .DependsOn(Dependency) - .OnlyWhen(() => false) - .Executes(() => { }); - - public Target ExecuteExplicitExecuteDependencies => _ => _ - .DependsOn(Dependency) - .OnlyWhen(() => false) - .WhenSkipped(DependencyBehavior.Execute) - .Executes(() => { }); - - public Target Execute => _ => _ - .DependsOn(Dependency) - .Executes(() => { }); - - public Target ExecuteDependency1SkipDependencies => _ => _ - .DependsOn(Dependency1) - .OnlyWhen(() => false) - .WhenSkipped(DependencyBehavior.Skip) - .Executes(() => { }); - } - } -} +// // Copyright 2018 Maintainers of NUKE. +// // Distributed under the MIT License. +// // https://github.com/nuke-build/nuke/blob/master/LICENSE +// +// using System; +// using System.Linq; +// using FluentAssertions; +// using Nuke.Common.Execution; +// using Xunit; +// +// namespace Nuke.Common.Tests.Execution +// { +// public class TargetDefinitionLoaderTest +// { +// [Theory] +// [InlineData( +// new[] { nameof(TestBuild.Execute) }, +// new[] { nameof(TestBuild.Dependency), nameof(TestBuild.Execute) })] +// [InlineData( +// new[] { nameof(TestBuild.ExecuteSkipDependencies) }, +// new string[0])] +// [InlineData( +// new[] { nameof(TestBuild.ExecuteImplicitExecuteDependencies) }, +// new[] { nameof(TestBuild.Dependency) })] +// [InlineData( +// new[] { nameof(TestBuild.ExecuteExplicitExecuteDependencies) }, +// new[] { nameof(TestBuild.Dependency) })] +// [InlineData( +// new[] { nameof(TestBuild.ExecuteSkipDependencies), nameof(TestBuild.ExecuteImplicitExecuteDependencies) }, +// new[] { nameof(TestBuild.Dependency) })] +// [InlineData( +// new[] { nameof(TestBuild.Execute), nameof(TestBuild.ExecuteDependency1SkipDependencies) }, +// new[] { nameof(TestBuild.Dependency), nameof(TestBuild.Execute) })] +// [InlineData( +// new[] { nameof(TestBuild.ExecuteSkipDependencies), nameof(TestBuild.Dependency) }, +// new[] { nameof(TestBuild.Dependency) })] +// public void Test(string[] invokedTargetNames, string[] expectedTargets) +// { +// TargetDefinitionLoader.GetExecutingTargets( +// ExecutionTestUtility.CreateBuild(), +// invokedTargetNames, +// skippedTargetNames: null) +// .Where(x => !x.Skip && x.Conditions.All(y => y())) +// .Select(x => x.Name) +// .Should().BeEquivalentTo(expectedTargets); +// } +// +// internal class TestBuild : NukeBuild +// { +// public Target Dependency => _ => _ +// .Executes(() => { }); +// +// public Target Dependency1 => _ => _ +// .DependsOn(Dependency) +// .Executes(() => { }); +// +// public Target ExecuteSkipDependencies => _ => _ +// .DependsOn(Dependency) +// .OnlyWhen(() => false) +// .WhenSkipped(DependencyBehavior.Skip) +// .Executes(() => { }); +// +// public Target ExecuteImplicitExecuteDependencies => _ => _ +// .DependsOn(Dependency) +// .OnlyWhen(() => false) +// .Executes(() => { }); +// +// public Target ExecuteExplicitExecuteDependencies => _ => _ +// .DependsOn(Dependency) +// .OnlyWhen(() => false) +// .WhenSkipped(DependencyBehavior.Execute) +// .Executes(() => { }); +// +// public Target Execute => _ => _ +// .DependsOn(Dependency) +// .Executes(() => { }); +// +// public Target ExecuteDependency1SkipDependencies => _ => _ +// .DependsOn(Dependency1) +// .OnlyWhen(() => false) +// .WhenSkipped(DependencyBehavior.Skip) +// .Executes(() => { }); +// } +// } +// } diff --git a/source/Nuke.Common/Execution/BuildExecutor.cs b/source/Nuke.Common/Execution/BuildExecutor.cs index 498898e48..5ca7722af 100644 --- a/source/Nuke.Common/Execution/BuildExecutor.cs +++ b/source/Nuke.Common/Execution/BuildExecutor.cs @@ -1,21 +1,14 @@ -// Copyright 2018 Maintainers of NUKE. +// Copyright 2019 Maintainers of NUKE. // Distributed under the MIT License. // https://github.com/nuke-build/nuke/blob/master/LICENSE using System; using System.Collections.Generic; using System.Diagnostics; -using System.Globalization; using System.IO; using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Threading; -using System.Threading.Tasks; +using JetBrains.Annotations; using Nuke.Common.IO; -using Nuke.Common.OutputSinks; -using Nuke.Common.ProjectModel; -using Nuke.Common.Tooling; using Nuke.Common.Utilities; using Nuke.Common.Utilities.Collections; @@ -23,190 +16,48 @@ namespace Nuke.Common.Execution { internal static class BuildExecutor { - public const string DefaultTarget = "default"; - private const int c_debuggerAttachTimeout = 10_000; - private const int c_configurationCheckTimeout = 500; + private static PathConstruction.AbsolutePath BuildAttemptFile => Constants.GetBuildAttemptFile(NukeBuild.RootDirectory); - public static int Execute(Expression> defaultTargetExpression) - where T : NukeBuild + public static void Execute( + NukeBuild build, + IReadOnlyCollection executionPlan, + [CanBeNull] IReadOnlyCollection skippedTargets) { - var executionList = default(IReadOnlyCollection); - var build = CreateBuildInstance(defaultTargetExpression); - - var extensions = build.GetType().GetCustomAttributes().ToList(); - extensions.ForEach(x => x.PreUserCode(build)); - - Console.CancelKeyPress += (s, e) => Finish(); - - try - { - build.OnBuildCreated(); - - Logger.OutputSink = build.OutputSink; - Logger.LogLevel = NukeBuild.LogLevel; - ToolPathResolver.NuGetPackagesConfigFile = build.NuGetPackagesConfigFile; - - Logger.Log($"NUKE Execution Engine {typeof(BuildExecutor).Assembly.GetInformationalText()}"); - Logger.Log(FigletTransform.GetText("NUKE")); - - extensions.ForEach(x => x.PreInitialization(build)); - - InjectionUtility.InjectValues(build); - executionList = TargetDefinitionLoader.GetExecutingTargets(build, NukeBuild.InvokedTargets, NukeBuild.SkippedTargets); - RequirementService.ValidateRequirements(executionList, build); - - build.OnBuildInitialized(); - - Execute(build, executionList); - - return 0; - } - catch (Exception exception) - { - Logger.Error(exception); - return -1; - } - finally - { - Finish(); - } + var invocationHash = GetInvocationHash(); + var previouslyExecutedTargets = GetPreviouslyExecutedTargets(invocationHash); + File.WriteAllLines(BuildAttemptFile, new[] { invocationHash }); - void Finish() + if (skippedTargets != null) { - if (Logger.OutputSink is SevereMessagesOutputSink outputSink) - { - Logger.Log(); - WriteWarningsAndErrors(outputSink); - } - - // ReSharper disable AccessToModifiedClosure - if (executionList != null) - { - Logger.Log(); - WriteSummary(executionList); - } - // ReSharper restore AccessToModifiedClosure - - build.OnBuildFinished(); + NukeBuild.ExecutionPlan + .Where(x => !NukeBuild.InvokedTargets.Contains(x.Name)) + .Where(x => skippedTargets.Count == 0 || skippedTargets.Contains(x.Name, StringComparer.OrdinalIgnoreCase)) + .ForEach(x => x.Status = ExecutionStatus.Skipped); } - } - - private static void AttachVisualStudioDebugger() - { - if (!ParameterService.Instance.GetParameter(nameof(AttachVisualStudioDebugger))) - return; - File.WriteAllText(NukeBuild.TemporaryDirectory / "visual-studio.dbg", - Process.GetCurrentProcess().Id.ToString()); - ControlFlow.Assert(SpinWait.SpinUntil(() => Debugger.IsAttached, millisecondsTimeout: c_debuggerAttachTimeout), - $"VisualStudio debugger was not attached within {c_debuggerAttachTimeout} milliseconds."); - } - - private static void CheckActiveBuildProjectConfigurations() - { - ControlFlow.AssertWarn(Task.Run(CheckConfiguration).Wait(c_configurationCheckTimeout), - $"Could not complete checking build configurations within {c_configurationCheckTimeout} milliseconds."); - - Task CheckConfiguration() + foreach (var target in executionPlan) { - Directory.GetFiles(NukeBuild.RootDirectory, "*.sln", SearchOption.AllDirectories) - .Select(ProjectModelTasks.ParseSolution) - .SelectMany(x => x.Projects) - .Where(x => x.Directory.Equals(NukeBuild.BuildProjectDirectory)) - .Where(x => x.Configurations.Any(y => y.Key.Contains("Build"))) - .ForEach(x => Logger.Warn($"Solution {x.Solution} has an active build configuration for {x}.")); - - return Task.CompletedTask; - } - } - - private static void HandleCompletion(NukeBuild build) - { - var completionItems = new SortedDictionary(); - - var targetNames = build.TargetDefinitions.Select(x => x.Name).OrderBy(x => x).ToList(); - completionItems[Constants.InvokedTargetsParameterName] = targetNames.ToArray(); - completionItems[Constants.SkippedTargetsParameterName] = targetNames.ToArray(); - - string[] GetSubItems(Type type) - { - if (type.IsEnum) - return type.GetEnumNames(); - if (type.IsSubclassOf(typeof(Enumeration))) - return type.GetFields(ReflectionService.Static).Select(x => x.Name).ToArray(); - return null; - } - - foreach (var parameter in InjectionUtility.GetParameterMembers(build.GetType())) - { - var parameterName = ParameterService.Instance.GetParameterName(parameter); - if (completionItems.ContainsKey(parameterName)) - continue; - - completionItems[parameterName] = GetSubItems(parameter.GetFieldOrPropertyType())?.OrderBy(x => x).ToArray(); - } - - SerializationTasks.YamlSerializeToFile(completionItems, Constants.GetCompletionFile(NukeBuild.RootDirectory)); - - if (EnvironmentInfo.ParameterSwitch(Constants.CompletionParameterName)) - Environment.Exit(exitCode: 0); - } - - internal static void Execute(NukeBuild build, IEnumerable executionList) - { - var buildAttemptFile = Constants.GetBuildAttemptFile(NukeBuild.RootDirectory); - var invocationHash = GetInvocationHash(); - - string[] GetExecutedTargets() - { - if (!NukeBuild.Continue || - !File.Exists(buildAttemptFile)) - return new string[0]; - - var previousBuild = File.ReadAllLines(buildAttemptFile); - if (previousBuild.FirstOrDefault() != invocationHash) - { - Logger.Warn("Build invocation changed. Starting over..."); - return new string[0]; - } - - return previousBuild.Skip(1).ToArray(); - } - - var executedTargets = GetExecutedTargets(); - File.WriteAllLines(buildAttemptFile, new[] { invocationHash }); - - foreach (var target in executionList) - { - if (target.Factory == null) - { - target.Status = ExecutionStatus.Absent; - build.OnTargetAbsent(target.Name); - continue; - } - - if (target.Skip || - executedTargets.Contains(target.Name) || - target.DependencyBehavior == DependencyBehavior.Execute && target.Conditions.Any(x => !x())) + if (target.Status == ExecutionStatus.Skipped || + previouslyExecutedTargets.Contains(target.Name) || + target.Conditions.Any(x => !x())) { target.Status = ExecutionStatus.Skipped; build.OnTargetSkipped(target.Name); - File.AppendAllLines(buildAttemptFile, new[] { target.Name }); + AppendToBuildAttemptFile(target.Name); continue; } using (Logger.Block(target.Name)) { - target.Status = ExecutionStatus.Aborted; + target.Status = ExecutionStatus.Executing; build.OnTargetStart(target.Name); var stopwatch = Stopwatch.StartNew(); - try { target.Actions.ForEach(x => x()); target.Status = ExecutionStatus.Executed; build.OnTargetExecuted(target.Name); - File.AppendAllLines(buildAttemptFile, new[] { target.Name }); + AppendToBuildAttemptFile(target.Name); } catch { @@ -230,112 +81,26 @@ private static string GetInvocationHash() .JoinSpace(); return invocation.GetMD5Hash(); } - - private static void HandleEarlyExits(T build) - where T : NukeBuild - { - if (NukeBuild.Help) - { - Logger.Log(HelpTextService.GetTargetsText(build)); - Logger.Log(HelpTextService.GetParametersText(build)); - } - - if (NukeBuild.Graph) - GraphService.ShowGraph(build); - - if (NukeBuild.Help || NukeBuild.Graph) - Environment.Exit(exitCode: 0); - } - - private static T CreateBuildInstance(Expression> defaultTargetExpression) - where T : NukeBuild - { - var constructors = typeof(T).GetConstructors(); - ControlFlow.Assert(constructors.Length == 1 && constructors.Single().GetParameters().Length == 0, - $"Type '{typeof(T).Name}' must declare a single parameterless constructor."); - - var build = Activator.CreateInstance(); - build.TargetDefinitions = build.GetTargetDefinitions(defaultTargetExpression); - - return build; - } - private static void WriteSummary(IReadOnlyCollection executionList) + private static IReadOnlyCollection GetPreviouslyExecutedTargets(string invocationHash) { - var firstColumn = Math.Max(executionList.Max(x => x.Name.Length) + 4, val2: 20); - var secondColumn = 10; - var thirdColumn = 10; - var allColumns = firstColumn + secondColumn + thirdColumn; - var totalDuration = executionList.Aggregate(TimeSpan.Zero, (t, x) => t.Add(x.Duration)); - - string CreateLine(string target, string executionStatus, string duration) - => target.PadRight(firstColumn, paddingChar: ' ') - + executionStatus.PadRight(secondColumn, paddingChar: ' ') - + duration.PadLeft(thirdColumn, paddingChar: ' '); - - string ToMinutesAndSeconds(TimeSpan duration) - => $"{(int) duration.TotalMinutes}:{duration:ss}"; - - Logger.Log(new string(c: '=', count: allColumns)); - Logger.Log(CreateLine("Target", "Status", "Duration")); - Logger.Log(new string(c: '-', count: allColumns)); - foreach (var target in executionList) + if (!NukeBuild.Continue || + !File.Exists(BuildAttemptFile)) + return new string[0]; + + var previousBuild = File.ReadAllLines(BuildAttemptFile); + if (previousBuild.FirstOrDefault() != invocationHash) { - var line = CreateLine(target.Name, target.Status.ToString(), ToMinutesAndSeconds(target.Duration)); - switch (target.Status) - { - case ExecutionStatus.Absent: - case ExecutionStatus.Skipped: - Logger.Log(line); - break; - case ExecutionStatus.Executed: - Logger.Success(line); - break; - case ExecutionStatus.Aborted: - case ExecutionStatus.NotRun: - case ExecutionStatus.Failed: - Logger.Error(line); - break; - } + Logger.Warn("Build invocation changed. Starting over..."); + return new string[0]; } - Logger.Log(new string(c: '-', count: allColumns)); - Logger.Log(CreateLine("Total", "", ToMinutesAndSeconds(totalDuration))); - Logger.Log(new string(c: '=', count: allColumns)); - Logger.Log(); - - var buildSucceeded = executionList - .All(x => x.Status != ExecutionStatus.Failed && - x.Status != ExecutionStatus.NotRun && - x.Status != ExecutionStatus.Aborted); - if (buildSucceeded) - Logger.Success($"Build succeeded on {DateTime.Now.ToString(CultureInfo.CurrentCulture)}."); - else - Logger.Error($"Build failed on {DateTime.Now.ToString(CultureInfo.CurrentCulture)}."); - Logger.Log(); + return previousBuild.Skip(1).ToArray(); } - - public static void WriteWarningsAndErrors(SevereMessagesOutputSink outputSink) - { - if (outputSink.SevereMessages.Count <= 0) - return; - - Logger.Log("Repeating warnings and errors:"); - foreach (var severeMessage in outputSink.SevereMessages.ToList()) - { - switch (severeMessage.Item1) - { - case LogLevel.Warning: - Logger.Warn(severeMessage.Item2); - break; - case LogLevel.Error: - Logger.Error(severeMessage.Item2); - break; - default: - throw new ArgumentOutOfRangeException(); - } - } + private static void AppendToBuildAttemptFile(string value) + { + File.AppendAllLines(BuildAttemptFile, new[] { value }); } } } diff --git a/source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs b/source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs index 789abe2f6..704585e00 100644 --- a/source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs +++ b/source/Nuke.Common/Execution/BuildExtensionAttributeBase.cs @@ -7,15 +7,16 @@ namespace Nuke.Common.Execution { - [AttributeUsage(AttributeTargets.Class)] - public abstract class BuildExtensionAttributeBase : Attribute + public interface IBuildExtension { - public virtual void PreUserCode(NukeBuild instance) - { - } + void Execute(NukeBuild build); + } - public virtual void PreInitialization(NukeBuild instance) - { - } + public interface IPreLogoBuildExtension : IBuildExtension + { + } + + public interface IPostLogoBuildExtension : IBuildExtension + { } } diff --git a/source/Nuke.Common/Execution/BuildExtensions.cs b/source/Nuke.Common/Execution/BuildExtensions.cs index 7f123af00..fc7598b85 100644 --- a/source/Nuke.Common/Execution/BuildExtensions.cs +++ b/source/Nuke.Common/Execution/BuildExtensions.cs @@ -3,56 +3,11 @@ // https://github.com/nuke-build/nuke/blob/master/LICENSE using System; -using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; -using System.Reflection; namespace Nuke.Common.Execution { internal static class BuildExtensions { - public static IReadOnlyCollection GetTargetDefinitions( - this T build, - Expression> defaultTargetExpression) - where T : NukeBuild - { - var defaultTarget = defaultTargetExpression.Compile().Invoke(build); - var targetDefinitions = build.GetType() - .GetProperties(ReflectionService.Instance) - .Where(x => x.PropertyType == typeof(Target)) - .Select(x => LoadTargetDefinition(build, x)).ToList(); - var factoryDictionary = targetDefinitions.ToDictionary(x => x.Factory, x => x); - - foreach (var targetDefinition in targetDefinitions) - { - targetDefinition.IsDefault = targetDefinition.Factory == defaultTarget; - - var dependencies = GetDependencies(targetDefinition, factoryDictionary); - targetDefinition.TargetDefinitionDependencies.AddRange(dependencies); - } - - return targetDefinitions; - } - - private static TargetDefinition LoadTargetDefinition(NukeBuild build, PropertyInfo property) - { - var targetFactory = (Target) property.GetValue(build); - return TargetDefinition.Create(property.Name, targetFactory); - } - - private static IEnumerable GetDependencies( - TargetDefinition targetDefinition, - IReadOnlyDictionary factoryDictionary) - { - foreach (var target in targetDefinition.FactoryDependencies.Select(x => factoryDictionary[x])) - yield return target; - - foreach (var target in targetDefinition.RunAfterTargets.Select(x => factoryDictionary[x])) - yield return target; - - foreach (var target in factoryDictionary.Values.Where(x => x.RunBeforeTargets.Contains(targetDefinition.Factory))) - yield return target; - } } } diff --git a/source/Nuke.Common/Execution/BuildManager.cs b/source/Nuke.Common/Execution/BuildManager.cs new file mode 100644 index 000000000..53e211b64 --- /dev/null +++ b/source/Nuke.Common/Execution/BuildManager.cs @@ -0,0 +1,175 @@ +// Copyright 2018 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Linq.Expressions; +using Nuke.Common.OutputSinks; +using Nuke.Common.Tooling; +using Nuke.Common.Utilities; +using Nuke.Common.Utilities.Collections; + +namespace Nuke.Common.Execution +{ + internal static class BuildManager + { + public static int Execute(Expression> defaultTargetExpression) + where T : NukeBuild + { + var build = Create(); + NukeBuild.ExecutableTargets = ExecutableTargetFactory.CreateAll(build, defaultTargetExpression); + + try + { + build.Execute(); + build.OnBuildCreated(); + + Logger.OutputSink = build.OutputSink; + Logger.LogLevel = NukeBuild.LogLevel; + ToolPathResolver.NuGetPackagesConfigFile = build.NuGetPackagesConfigFile; + + Logger.Log($"NUKE Execution Engine {typeof(BuildManager).Assembly.GetInformationalText()}"); + Logger.Log(FigletTransform.GetText("NUKE")); + + build.Execute(); + NukeBuild.ExecutionPlan = ExecutionPlanner.GetExecutionPlan( + NukeBuild.ExecutableTargets, + ParameterService.Instance.GetParameter(() => NukeBuild.InvokedTargets) ?? + ParameterService.Instance.GetPositionalCommandLineArguments(separator: Constants.TargetsSeparator.Single())); + Console.CancelKeyPress += (s, e) => Finish(); + + InjectionUtility.InjectValues(build); + RequirementService.ValidateRequirements(NukeBuild.ExecutionPlan, build); + + build.OnBuildInitialized(); + + BuildExecutor.Execute( + build, + NukeBuild.ExecutionPlan, + ParameterService.Instance.GetParameter(() => NukeBuild.SkippedTargets)); + + return 0; + } + catch (Exception exception) + { + Logger.Error(exception); + return -1; + } + finally + { + Finish(); + } + + void Finish() + { + NukeBuild.ExecutionPlan + .Where(x => x.Status == ExecutionStatus.Executing) + .ForEach(x => x.Status = ExecutionStatus.Aborted); + + if (Logger.OutputSink is SevereMessagesOutputSink outputSink) + { + Logger.Log(); + WriteWarningsAndErrors(outputSink); + } + + if (NukeBuild.ExecutionPlan != null) + { + Logger.Log(); + WriteSummary(NukeBuild.ExecutionPlan); + } + + build.OnBuildFinished(); + } + } + + public static T Create() + where T : NukeBuild + { + var constructors = typeof(T).GetConstructors(); + ControlFlow.Assert(constructors.Length == 1 && constructors.Single().GetParameters().Length == 0, + $"Type '{typeof(T).Name}' must declare a single parameterless constructor."); + + return Activator.CreateInstance(); + } + + private static void WriteSummary(IReadOnlyCollection executionPlan) + { + var firstColumn = Math.Max(executionPlan.Max(x => x.Name.Length) + 4, val2: 20); + var secondColumn = 10; + var thirdColumn = 10; + var allColumns = firstColumn + secondColumn + thirdColumn; + var totalDuration = executionPlan.Aggregate(TimeSpan.Zero, (t, x) => t.Add(x.Duration)); + + string CreateLine(string target, string executionStatus, string duration) + => target.PadRight(firstColumn, paddingChar: ' ') + + executionStatus.PadRight(secondColumn, paddingChar: ' ') + + duration.PadLeft(thirdColumn, paddingChar: ' '); + + string ToMinutesAndSeconds(TimeSpan duration) + => $"{(int) duration.TotalMinutes}:{duration:ss}"; + + Logger.Log(new string(c: '=', count: allColumns)); + Logger.Log(CreateLine("Target", "Status", "Duration")); + Logger.Log(new string(c: '-', count: allColumns)); + foreach (var target in executionPlan) + { + var line = CreateLine(target.Name, target.Status.ToString(), ToMinutesAndSeconds(target.Duration)); + switch (target.Status) + { + case ExecutionStatus.Skipped: + Logger.Log(line); + break; + case ExecutionStatus.Executed: + Logger.Success(line); + break; + case ExecutionStatus.Aborted: + case ExecutionStatus.NotRun: + case ExecutionStatus.Failed: + Logger.Error(line); + break; + } + } + + Logger.Log(new string(c: '-', count: allColumns)); + Logger.Log(CreateLine("Total", "", ToMinutesAndSeconds(totalDuration))); + Logger.Log(new string(c: '=', count: allColumns)); + Logger.Log(); + + var buildSucceeded = executionPlan + .All(x => x.Status != ExecutionStatus.Failed && + x.Status != ExecutionStatus.NotRun && + x.Status != ExecutionStatus.Aborted); + if (buildSucceeded) + Logger.Success($"Build succeeded on {DateTime.Now.ToString(CultureInfo.CurrentCulture)}."); + else + Logger.Error($"Build failed on {DateTime.Now.ToString(CultureInfo.CurrentCulture)}."); + Logger.Log(); + } + + public static void WriteWarningsAndErrors(SevereMessagesOutputSink outputSink) + { + if (outputSink.SevereMessages.Count <= 0) + return; + + Logger.Log("Repeating warnings and errors:"); + + foreach (var severeMessage in outputSink.SevereMessages.ToList()) + { + switch (severeMessage.Item1) + { + case LogLevel.Warning: + Logger.Warn(severeMessage.Item2); + break; + case LogLevel.Error: + Logger.Error(severeMessage.Item2); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + } +} diff --git a/source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs b/source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs index 15002b1b7..a29f2e411 100644 --- a/source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs +++ b/source/Nuke.Common/Execution/CheckPathEnvironmentVariableAttribute.cs @@ -10,9 +10,10 @@ namespace Nuke.Common.Execution { [PublicAPI] - public class CheckPathEnvironmentVariableAttribute : BuildExtensionAttributeBase + [AttributeUsage(AttributeTargets.Class)] + public class CheckPathEnvironmentVariableAttribute : Attribute, IPostLogoBuildExtension { - public override void PreInitialization(NukeBuild instance) + public void Execute(NukeBuild instance) { ProcessManager.CheckPathEnvironmentVariable(); } diff --git a/source/Nuke.Common/Execution/ExecutableTarget.cs b/source/Nuke.Common/Execution/ExecutableTarget.cs new file mode 100644 index 000000000..33597f174 --- /dev/null +++ b/source/Nuke.Common/Execution/ExecutableTarget.cs @@ -0,0 +1,54 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace Nuke.Common.Execution +{ + [DebuggerDisplay("{" + nameof(ToDebugString) + "}")] + internal class ExecutableTarget + { + public ExecutableTarget( + PropertyInfo property, + Target factory, + TargetDefinition definition, + bool isDefault) + { + Property = property; + Factory = factory; + Definition = definition; + IsDefault = isDefault; + } + + public PropertyInfo Property { get; } + public string Name => Property.Name; + public Target Factory { get; } + public TargetDefinition Definition { get; } + public string Description => Definition.Description; + public List> Conditions => Definition.Conditions; + public IReadOnlyList Requirements => Definition.Requirements; + public IReadOnlyList Actions => Definition.Actions; + public ICollection ExecutionDependencies { get; } = new List(); + public ICollection OrderDependencies { get; } = new List(); + public ICollection TriggerDependencies { get; } = new List(); + public ICollection Triggers { get; } = new List(); + public IReadOnlyCollection AllDependencies + => ExecutionDependencies.Concat(OrderDependencies).Concat(TriggerDependencies).ToList(); + public bool IsDefault { get; } + + public ExecutionStatus Status { get; set; } + public TimeSpan Duration { get; set; } + public bool Invoked { get; set; } + + internal string ToDebugString() + { + return Name; + } + } +} diff --git a/source/Nuke.Common/Execution/ExecutableTargetFactory.cs b/source/Nuke.Common/Execution/ExecutableTargetFactory.cs new file mode 100644 index 000000000..0c9571d29 --- /dev/null +++ b/source/Nuke.Common/Execution/ExecutableTargetFactory.cs @@ -0,0 +1,63 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NuGet.Packaging; + +namespace Nuke.Common.Execution +{ + internal static class ExecutableTargetFactory + { + public static IReadOnlyCollection CreateAll( + T build, + Expression> defaultTargetExpression) + where T : NukeBuild + { + var defaultTarget = defaultTargetExpression.Compile().Invoke(build); + var properties = build.GetType() + .GetProperties(ReflectionService.Instance) + .Where(x => x.PropertyType == typeof(Target)).ToList(); + + var executables = new List(); + + foreach (var property in properties) + { + var factory = (Target) property.GetValue(build); + var definition = new TargetDefinition(); + factory.Invoke(definition); + executables.Add(new ExecutableTarget(property, factory, definition, isDefault: factory == defaultTarget)); + } + + + + foreach (var executable in executables) + { + IEnumerable GetDependencies( + Func> directDependenciesSelector, + Func> indirectDependenciesSelector) + { + foreach (var factoryDependency in directDependenciesSelector(executable.Definition)) + yield return executables.Single(x => x.Factory == factoryDependency); + + foreach (var otherExecutables in executables.Where(x => x != executable)) + { + var otherDependencies = indirectDependenciesSelector(otherExecutables.Definition); + if (otherDependencies.Any(x => x == executable.Factory)) + yield return otherExecutables; + } + } + + executable.ExecutionDependencies.AddRange(GetDependencies(x => x.DependsOnTargets, x => x.DependentForTargets)); + executable.OrderDependencies.AddRange(GetDependencies(x => x.AfterTargets, x => x.BeforeTargets)); + executable.TriggerDependencies.AddRange(GetDependencies(x => x.TriggeredByTargets, x => x.TriggersTargets)); + executable.Triggers.AddRange(GetDependencies(x => x.TriggersTargets, x => x.TriggeredByTargets)); + } + + return executables; + } + } +} diff --git a/source/Nuke.Common/Execution/ExecutionPlanner.cs b/source/Nuke.Common/Execution/ExecutionPlanner.cs new file mode 100644 index 000000000..0adfa7572 --- /dev/null +++ b/source/Nuke.Common/Execution/ExecutionPlanner.cs @@ -0,0 +1,115 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using JetBrains.Annotations; +using NuGet.Packaging; +using Nuke.Common.Utilities; +using Nuke.Common.Utilities.Collections; + +namespace Nuke.Common.Execution +{ + internal static class ExecutionPlanner + { + public static IReadOnlyCollection GetExecutionPlan( + IReadOnlyCollection executableTargets, + [CanBeNull] IReadOnlyCollection invokedTargetNames) + { + var invokedTargets = invokedTargetNames?.Select(x => GetExecutableTarget(x, executableTargets)).ToArray() ?? + new[] { executableTargets.Single(x => x.IsDefault) }; + invokedTargets.ForEach(x => x.Invoked = true); + + IReadOnlyCollection executionPlan; + IReadOnlyCollection additionallyTriggered; + do + { + executionPlan = GetExecutionPlanInternal(executableTargets, invokedTargets); + additionallyTriggered = executionPlan.SelectMany(x => x.Triggers).Except(executionPlan).ToList(); + invokedTargets = executionPlan.Concat(additionallyTriggered).ToArray(); + } while (additionallyTriggered.Count > 0); + + return executionPlan; + } + + private static IReadOnlyCollection GetExecutionPlanInternal( + IReadOnlyCollection executableTargets, + ICollection invokedTargets) + { + var vertexDictionary = GetVertexDictionary(executableTargets); + var graphAsList = vertexDictionary.Values.ToList(); + var executingTargets = new List(); + + while (graphAsList.Any()) + { + var independents = graphAsList.Where(x => !graphAsList.Any(y => y.Dependencies.Contains(x))).ToList(); + if (EnvironmentInfo.ArgumentSwitch("strict") && independents.Count > 1) + { + ControlFlow.Fail( + new[] { "Incomplete target definition order." } + .Concat(independents.Select(x => $" - {x.Value.Name}")) + .JoinNewLine()); + } + + var independent = independents.FirstOrDefault(); + if (independent == null) + { + var scc = new StronglyConnectedComponentFinder(); + var cycles = scc.DetectCycle(graphAsList) + .Cycles() + .Select(x => string.Join(" -> ", x.Select(y => y.Value.Name))); + + ControlFlow.Fail( + new[] { "Circular dependencies between target definitions." } + .Concat(independents.Select(x => $" - {cycles}")) + .JoinNewLine()); + } + + graphAsList.Remove(independent); + + var executableTarget = independent.Value; + if (!invokedTargets.Contains(executableTarget) && + !executingTargets.SelectMany(x => x.ExecutionDependencies).Contains(executableTarget)) + continue; + + executableTarget.Status = ExecutionStatus.NotRun; + executingTargets.Add(executableTarget); + } + + executingTargets.Reverse(); + + return executingTargets; + } + + private static IReadOnlyDictionary> GetVertexDictionary( + IReadOnlyCollection executableTargets) + { + var vertexDictionary = executableTargets.ToDictionary(x => x, x => new Vertex(x)); + foreach (var (executable, vertex) in vertexDictionary) + vertex.Dependencies.AddRange(executable.AllDependencies.Select(x => vertexDictionary[x])); + + return vertexDictionary; + } + + private static ExecutableTarget GetExecutableTarget( + string targetName, + IReadOnlyCollection executableTargets) + { + var executableTarget = executableTargets.SingleOrDefault(x => x.Name.EqualsOrdinalIgnoreCase(targetName)); + if (executableTarget == null) + { + var stringBuilder = new StringBuilder() + .AppendLine($"Target with name '{targetName}' is not available.") + .AppendLine() + .AppendLine(HelpTextService.GetTargetsText(executableTargets)); + + ControlFlow.Fail(stringBuilder.ToString()); + } + + return executableTarget; + } + } +} diff --git a/source/Nuke.Common/Execution/ExecutionStatus.cs b/source/Nuke.Common/Execution/ExecutionStatus.cs index 4be72c884..46b6ea4a9 100644 --- a/source/Nuke.Common/Execution/ExecutionStatus.cs +++ b/source/Nuke.Common/Execution/ExecutionStatus.cs @@ -13,7 +13,7 @@ public enum ExecutionStatus Skipped, Executed, Failed, - Absent, + Executing, Aborted } } diff --git a/source/Nuke.Common/Execution/GraphService.cs b/source/Nuke.Common/Execution/GraphService.cs index 6571527d8..665769854 100644 --- a/source/Nuke.Common/Execution/GraphService.cs +++ b/source/Nuke.Common/Execution/GraphService.cs @@ -3,6 +3,7 @@ // https://github.com/nuke-build/nuke/blob/master/LICENSE using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; @@ -13,8 +14,7 @@ namespace Nuke.Common.Execution { internal static class GraphService { - public static void ShowGraph(T build) - where T : NukeBuild + public static void ShowGraph(IReadOnlyCollection executableTargets) { string GetStringFromStream(Stream stream) { @@ -24,18 +24,18 @@ string GetStringFromStream(Stream stream) } } - var assembly = typeof(BuildExecutor).GetTypeInfo().Assembly; - var resourceName = typeof(BuildExecutor).Namespace + ".graph.html"; + var assembly = typeof(BuildManager).GetTypeInfo().Assembly; + var resourceName = typeof(BuildManager).Namespace + ".graph.html"; var resourceStream = assembly.GetManifestResourceStream(resourceName).NotNull("resourceStream != null"); var graph = new StringBuilder(); - foreach (var target in build.TargetDefinitions) + foreach (var executableTarget in executableTargets) { - var dependentBy = build.TargetDefinitions.Where(x => x.TargetDefinitionDependencies.Contains(target)).ToList(); + var dependentBy = executableTargets.Where(x => x.AllDependencies.Contains(executableTarget)).ToList(); if (dependentBy.Count == 0) - graph.AppendLine(target.GetDeclaration()); + graph.AppendLine(executableTarget.GetDeclaration()); else - dependentBy.ForEach(x => graph.AppendLine($"{target.GetDeclaration()} --> {x.GetDeclaration()}")); + dependentBy.ForEach(x => graph.AppendLine($"{executableTarget.GetDeclaration()} --> {x.GetDeclaration()}")); } var path = Path.Combine(NukeBuild.TemporaryDirectory, "graph.html"); @@ -50,11 +50,11 @@ string GetStringFromStream(Stream stream) }); } - private static string GetDeclaration(this TargetDefinition targetDefinition) + private static string GetDeclaration(this ExecutableTarget executableTarget) { - return targetDefinition.IsDefault - ? $"defaultTarget[{targetDefinition.Name}]" - : targetDefinition.Name; + return executableTarget.IsDefault + ? $"defaultTarget[{executableTarget.Name}]" + : executableTarget.Name; } } } diff --git a/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs b/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs index bb0e711d7..563cd8e38 100644 --- a/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs +++ b/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs @@ -7,18 +7,19 @@ namespace Nuke.Common.Execution { - internal class HandleHelpRequestsAttribute : BuildExtensionAttributeBase + [AttributeUsage(AttributeTargets.Class)] + internal class HandleHelpRequestsAttribute : Attribute, IPostLogoBuildExtension { - public override void PreInitialization(NukeBuild instance) + public void Execute(NukeBuild instance) { if (NukeBuild.Help) { - Logger.Log(HelpTextService.GetTargetsText(instance)); - Logger.Log(HelpTextService.GetParametersText(instance)); + Logger.Log(HelpTextService.GetTargetsText(NukeBuild.ExecutableTargets)); + Logger.Log(HelpTextService.GetParametersText(instance, NukeBuild.ExecutableTargets)); } if (NukeBuild.Graph) - GraphService.ShowGraph(instance); + GraphService.ShowGraph(NukeBuild.ExecutableTargets); if (NukeBuild.Help || NukeBuild.Graph) Environment.Exit(exitCode: 0); diff --git a/source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs b/source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs index cd1eacd98..491924085 100644 --- a/source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs +++ b/source/Nuke.Common/Execution/HandleShellCompletionAttribute.cs @@ -10,13 +10,14 @@ namespace Nuke.Common.Execution { - internal class HandleShellCompletionAttribute : BuildExtensionAttributeBase + [AttributeUsage(AttributeTargets.Class)] + internal class HandleShellCompletionAttribute : Attribute, IPreLogoBuildExtension { - public override void PreUserCode(NukeBuild instance) + public void Execute(NukeBuild instance) { var completionItems = new SortedDictionary(); - var targetNames = instance.TargetDefinitions.Select(x => x.Name).OrderBy(x => x).ToList(); + var targetNames = NukeBuild.ExecutableTargets.Select(x => x.Name).OrderBy(x => x).ToList(); completionItems[Constants.InvokedTargetsParameterName] = targetNames.ToArray(); completionItems[Constants.SkippedTargetsParameterName] = targetNames.ToArray(); diff --git a/source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs b/source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs index 4cc44fbda..98c7055f0 100644 --- a/source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs +++ b/source/Nuke.Common/Execution/HandleVisualStudioDebuggingAttribute.cs @@ -12,11 +12,12 @@ namespace Nuke.Common.Execution { [PublicAPI] - public class HandleVisualStudioDebuggingAttribute : BuildExtensionAttributeBase + [AttributeUsage(AttributeTargets.Class)] + public class HandleVisualStudioDebuggingAttribute : Attribute, IPreLogoBuildExtension { public int TimeoutInMilliseconds { get; } = 10_000; - public override void PreUserCode(NukeBuild instance) + public void Execute(NukeBuild instance) { if (!ParameterService.Instance.GetParameter(Constants.VisualStudioDebugParameterName)) return; diff --git a/source/Nuke.Common/Execution/HelpTextService.cs b/source/Nuke.Common/Execution/HelpTextService.cs index 7a237fa12..799d56868 100644 --- a/source/Nuke.Common/Execution/HelpTextService.cs +++ b/source/Nuke.Common/Execution/HelpTextService.cs @@ -13,19 +13,18 @@ namespace Nuke.Common.Execution { internal static class HelpTextService { - public static string GetTargetsText(T build) - where T : NukeBuild + public static string GetTargetsText(IReadOnlyCollection executableTargets) { var builder = new StringBuilder(); - var longestTargetName = build.TargetDefinitions.Select(x => x.Name.Length).OrderByDescending(x => x).First(); + var longestTargetName = executableTargets.Select(x => x.Name.Length).OrderByDescending(x => x).First(); var padRightTargets = Math.Max(longestTargetName, val2: 20); builder.AppendLine("Targets (with their direct dependencies):"); builder.AppendLine(); - foreach (var target in build.TargetDefinitions) + foreach (var target in executableTargets) { - var dependencies = target.TargetDefinitionDependencies.Count > 0 - ? $" -> {target.TargetDefinitionDependencies.Select(x => x.Name).JoinComma()}" + var dependencies = target.ExecutionDependencies.Count > 0 + ? $" -> {target.ExecutionDependencies.Select(x => x.Name).JoinComma()}" : string.Empty; var targetEntry = target.Name + (target.IsDefault ? " (default)" : string.Empty); builder.AppendLine($" {targetEntry.PadRight(padRightTargets)}{dependencies}"); @@ -36,10 +35,9 @@ public static string GetTargetsText(T build) return builder.ToString(); } - public static string GetParametersText(T build) - where T : NukeBuild + public static string GetParametersText(NukeBuild build, IReadOnlyCollection executableTargets) { - var defaultTarget = build.TargetDefinitions.Single(x => x.IsDefault); + var defaultTarget = executableTargets.Single(x => x.IsDefault); var builder = new StringBuilder(); var parameters = InjectionUtility.GetParameterMembers(build.GetType()).OrderBy(x => x.Name).ToList(); diff --git a/source/Nuke.Common/Execution/RequirementService.cs b/source/Nuke.Common/Execution/RequirementService.cs index 79186ff68..44bdb640d 100644 --- a/source/Nuke.Common/Execution/RequirementService.cs +++ b/source/Nuke.Common/Execution/RequirementService.cs @@ -12,9 +12,9 @@ namespace Nuke.Common.Execution { internal static class RequirementService { - public static void ValidateRequirements(IReadOnlyCollection executionList, NukeBuild build) + public static void ValidateRequirements(IReadOnlyCollection executionPlan, NukeBuild build) { - foreach (var target in executionList.Where(x => !x.Skip)) + foreach (var target in executionPlan) foreach (var requirement in target.Requirements) { if (requirement is Expression> boolExpression) diff --git a/source/Nuke.Common/Execution/TargetDefinition.cs b/source/Nuke.Common/Execution/TargetDefinition.cs index f0909e1f5..3964d08f7 100644 --- a/source/Nuke.Common/Execution/TargetDefinition.cs +++ b/source/Nuke.Common/Execution/TargetDefinition.cs @@ -7,51 +7,25 @@ using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; -using JetBrains.Annotations; namespace Nuke.Common.Execution { internal class TargetDefinition : ITargetDefinition { - public static TargetDefinition Create(string name, Target factory = null) - { - return new TargetDefinition(name, factory); - } - - private TargetDefinition(string name, Target factory = null) - { - Name = name; - Factory = factory; - FactoryDependencies = new List(); - Actions = new List(); - Conditions = new List>(); - Requirements = new List(); - TargetDefinitionDependencies = new List(); - RunBeforeTargets = new List(); - RunAfterTargets = new List(); - DependencyBehavior = DependencyBehavior.Execute; - - factory?.Invoke(this); - } - - internal string Name { get; } - - [CanBeNull] - internal Target Factory { get; } - internal string Description { get; set; } internal bool IsDefault { get; set; } internal TimeSpan Duration { get; set; } internal ExecutionStatus Status { get; set; } - internal List> Conditions { get; } - internal List Requirements { get; } - internal List FactoryDependencies { get; } - internal List TargetDefinitionDependencies { get; } - internal List Actions { get; } + internal List> Conditions { get; } = new List>(); + internal List Requirements { get; } = new List(); + internal List DependsOnTargets { get; } = new List(); + internal List DependentForTargets { get; } = new List(); + internal List Actions { get; } = new List(); internal DependencyBehavior DependencyBehavior { get; private set; } - internal bool Skip { get; set; } - internal List RunBeforeTargets { get; private set; } - internal List RunAfterTargets { get; private set; } + internal List BeforeTargets { get; private set; } = new List(); + internal List AfterTargets { get; private set; } = new List(); + internal List TriggersTargets { get; private set; } = new List(); + internal List TriggeredByTargets { get; private set; } = new List(); ITargetDefinition ITargetDefinition.Description(string description) { @@ -77,7 +51,13 @@ public ITargetDefinition Executes(Func action) public ITargetDefinition DependsOn(params Target[] targets) { - FactoryDependencies.AddRange(targets); + DependsOnTargets.AddRange(targets); + return this; + } + + public ITargetDefinition DependentFor(params Target[] targets) + { + DependentForTargets.AddRange(targets); return this; } @@ -115,19 +95,26 @@ public ITargetDefinition WhenSkipped(DependencyBehavior dependencyBehavior) public ITargetDefinition Before(params Target[] targets) { - RunBeforeTargets.AddRange(targets); + BeforeTargets.AddRange(targets); return this; } public ITargetDefinition After(params Target[] targets) { - RunAfterTargets.AddRange(targets); + AfterTargets.AddRange(targets); + return this; + } + + public ITargetDefinition Triggers(params Target[] targets) + { + TriggersTargets.AddRange(targets); return this; } - public override string ToString() + public ITargetDefinition TriggeredBy(params Target[] targets) { - return $"Target '{Name}'"; + TriggeredByTargets.AddRange(targets); + return this; } } } diff --git a/source/Nuke.Common/Execution/TargetDefinitionLoader.cs b/source/Nuke.Common/Execution/TargetDefinitionLoader.cs deleted file mode 100644 index 6f168a3c9..000000000 --- a/source/Nuke.Common/Execution/TargetDefinitionLoader.cs +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2018 Maintainers of NUKE. -// Distributed under the MIT License. -// https://github.com/nuke-build/nuke/blob/master/LICENSE - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using JetBrains.Annotations; -using Nuke.Common.Utilities; -using Nuke.Common.Utilities.Collections; - -namespace Nuke.Common.Execution -{ - internal static class TargetDefinitionLoader - { - public static IReadOnlyCollection GetExecutingTargets( - NukeBuild build, - [CanBeNull] string[] invokedTargetNames, - [CanBeNull] string[] skippedTargetNames) - { - ControlFlow.Assert(build.TargetDefinitions.All(x => !x.Name.EqualsOrdinalIgnoreCase(BuildExecutor.DefaultTarget)), - $"The name '{BuildExecutor.DefaultTarget}' cannot be used as target name."); - - var invokedTargets = invokedTargetNames?.Select(x => GetDefinition(x, build)).ToList() ?? new List(); - var executingTargets = GetUnfilteredExecutingTargets(build, invokedTargets); - - var skippedTargets = executingTargets - .Where(x => !invokedTargets.Contains(x) && - skippedTargetNames != null && - (skippedTargetNames.Length == 0 || - skippedTargetNames.Contains(x.Name, StringComparer.OrdinalIgnoreCase))).ToList(); - skippedTargets.ForEach(x => x.Skip = true); - executingTargets - .Where(x => x.DependencyBehavior == DependencyBehavior.Skip) - .Where(x => x.Conditions.Any(y => !y())) - .ForEach(x => SkipTargetAndDependencies(x, invokedTargets, executingTargets)); - - string[] GetNames(IEnumerable targets) - => targets.Select(x => x.Name).ToArray(); - - NukeBuild.InvokedTargets = GetNames(invokedTargets); - NukeBuild.SkippedTargets = GetNames(skippedTargets); - NukeBuild.ExecutingTargets = GetNames(executingTargets.Except(skippedTargets)); - - return executingTargets; - } - - private static void SkipTargetAndDependencies( - TargetDefinition targetDefinition, - IReadOnlyCollection invokedTargets, - IReadOnlyCollection executingTargets, - IDictionary> skipRequestDictionary = null) - { - skipRequestDictionary = skipRequestDictionary ?? new Dictionary>(); - - targetDefinition.Skip = true; - foreach (var dependency in targetDefinition.TargetDefinitionDependencies) - { - if (invokedTargets.Contains(dependency)) - continue; - - var skipRequests = skipRequestDictionary.GetValueOrDefault(dependency); - if (skipRequests == null) - skipRequests = skipRequestDictionary[dependency] = new List(); - - var executingDependentTargets = executingTargets - .Where(x => x != targetDefinition) - .Where(x => x.TargetDefinitionDependencies.Contains(dependency) && !skipRequests.Contains(x)); - - if (executingDependentTargets.Any()) - skipRequests.Add(targetDefinition); - else - SkipTargetAndDependencies(dependency, invokedTargets, executingTargets, skipRequestDictionary); - } - } - - private static TargetDefinition GetDefinition( - string targetName, - NukeBuild build) - { - if (targetName.EqualsOrdinalIgnoreCase(BuildExecutor.DefaultTarget)) - return build.TargetDefinitions.Single(x => x.IsDefault); - - var targetDefinition = build.TargetDefinitions.SingleOrDefault(x => x.Name.EqualsOrdinalIgnoreCase(targetName)); - if (targetDefinition == null) - { - var stringBuilder = new StringBuilder() - .AppendLine($"Target with name '{targetName}' is not available.") - .AppendLine() - .AppendLine(HelpTextService.GetTargetsText(build)); - - ControlFlow.Fail(stringBuilder.ToString()); - } - - return targetDefinition; - } - - private static List GetUnfilteredExecutingTargets(NukeBuild build, IReadOnlyCollection invokedTargets) - { - var vertexDictionary = build.TargetDefinitions.ToDictionary(x => x, x => new Vertex(x)); - foreach (var pair in vertexDictionary) - pair.Value.Dependencies = pair.Key.TargetDefinitionDependencies.Select(x => vertexDictionary[x]).ToList(); - - var graphAsList = vertexDictionary.Values.ToList(); - var executingTargets = new List(); - - while (graphAsList.Any()) - { - var independents = graphAsList.Where(x => !graphAsList.Any(y => y.Dependencies.Contains(x))).ToList(); - if (EnvironmentInfo.ArgumentSwitch("strict") && independents.Count > 1) - { - ControlFlow.Fail( - new[] { "Incomplete target definition order." } - .Concat(independents.Select(x => $" - {x.Value.Name}")) - .JoinNewLine()); - } - - var independent = independents.FirstOrDefault(); - if (independent == null) - { - var scc = new StronglyConnectedComponentFinder(); - var cycles = scc.DetectCycle(graphAsList) - .Cycles() - .Select(x => string.Join(" -> ", x.Select(y => y.Value.Name))); - - ControlFlow.Fail( - new[] { "Circular dependencies between target definitions." } - .Concat(independents.Select(x => $" - {cycles}")) - .JoinNewLine()); - } - - graphAsList.Remove(independent); - - var targetDefinition = independent.Value; - var factoryDependencies = executingTargets.SelectMany(x => x.FactoryDependencies); - if (!invokedTargets.Contains(targetDefinition) && - !factoryDependencies.Contains(targetDefinition.Factory)) - continue; - - executingTargets.Add(targetDefinition); - } - - executingTargets.Reverse(); - - return executingTargets; - } - } -} diff --git a/source/Nuke.Common/ITargetDefinition.cs b/source/Nuke.Common/ITargetDefinition.cs index 971f17b07..b5dfa100f 100644 --- a/source/Nuke.Common/ITargetDefinition.cs +++ b/source/Nuke.Common/ITargetDefinition.cs @@ -41,6 +41,11 @@ public interface ITargetDefinition /// ITargetDefinition DependsOn(params Target[] targets); + /// + /// Adds a set of targets that are dependent for this target. + /// + ITargetDefinition DependentFor(params Target[] targets); + /// /// Adds a set of conditions that will be checked before executing this target. /// @@ -77,6 +82,16 @@ ITargetDefinition Requires(params Expression>[] parameterRequirement /// Defines if this target should run after other targets. /// ITargetDefinition After(params Target[] targets); + + /// + /// Defines targets that will be triggered after this target. + /// + ITargetDefinition Triggers(params Target[] targets); + + /// + /// Defines targets that will trigger this target. + /// + ITargetDefinition TriggeredBy(params Target[] targets); } /// diff --git a/source/Nuke.Common/NukeBuild.Statics.cs b/source/Nuke.Common/NukeBuild.Statics.cs index a0ef52ce8..fd1df2744 100644 --- a/source/Nuke.Common/NukeBuild.Statics.cs +++ b/source/Nuke.Common/NukeBuild.Statics.cs @@ -26,11 +26,6 @@ static NukeBuild() BuildAssemblyDirectory = GetBuildAssemblyDirectory(); BuildProjectDirectory = GetBuildProjectDirectory(BuildAssemblyDirectory); - InvokedTargets = ParameterService.Instance.GetParameter(() => InvokedTargets) ?? - ParameterService.Instance.GetPositionalCommandLineArguments(separator: TargetsSeparator.Single()) ?? - new[] { BuildExecutor.DefaultTarget }; - SkippedTargets = ParameterService.Instance.GetParameter(() => SkippedTargets); - Verbosity = ParameterService.Instance.GetParameter(() => Verbosity) ?? Verbosity.Normal; Host = ParameterService.Instance.GetParameter(() => Host) ?? GetHostType(); Continue = ParameterService.Instance.GetParameter(() => Continue); @@ -93,19 +88,21 @@ static NukeBuild() /// /// Gets the list of targets that were invoked. /// - [Parameter("List of targets to be executed. Default is '{default_target}'.", Name = InvokedTargetsParameterName, Separator = TargetsSeparator)] - public static string[] InvokedTargets { get; internal set; } + [Parameter("List of targets to be executed. Default is '{default_target}'.", + Name = InvokedTargetsParameterName, + Separator = TargetsSeparator)] + public static string[] InvokedTargets => ExecutionPlan.Where(x => x.Invoked).Select(x => x.Name).ToArray(); /// /// Gets the list of targets that are skipped. /// [Parameter("List of targets to be skipped. Empty list skips all dependencies.", Name = SkippedTargetsParameterName, Separator = TargetsSeparator)] - public static string[] SkippedTargets { get; internal set; } - + public static string[] SkippedTargets => ExecutionPlan.Where(x => x.Status == ExecutionStatus.Skipped).Select(x => x.Name).ToArray(); + /// /// Gets the list of targets that are executing. /// - public static string[] ExecutingTargets { get; internal set; } + public static string[] ExecutingTargets => ExecutionPlan.Where(x => x.Status != ExecutionStatus.Skipped).Select(x => x.Name).ToArray(); [Parameter("Indicates to continue a previously failed build attempt.")] public static bool Continue { get; internal set; } diff --git a/source/Nuke.Common/NukeBuild.cs b/source/Nuke.Common/NukeBuild.cs index 0259e63e6..147ee900a 100644 --- a/source/Nuke.Common/NukeBuild.cs +++ b/source/Nuke.Common/NukeBuild.cs @@ -6,11 +6,13 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Reflection; using JetBrains.Annotations; using Nuke.Common.BuildServers; using Nuke.Common.Execution; using Nuke.Common.OutputSinks; using Nuke.Common.Tooling; +using Nuke.Common.Utilities.Collections; // ReSharper disable VirtualMemberNeverOverridden.Global @@ -18,7 +20,7 @@ namespace Nuke.Common { /// /// Base class for build definitions. Derived types must declare static int Main which calls - /// for the exit code. + /// for the exit code. /// /// /// @@ -54,10 +56,17 @@ public abstract partial class NukeBuild protected static int Execute(Expression> defaultTargetExpression) where T : NukeBuild { - return BuildExecutor.Execute(defaultTargetExpression); + return BuildManager.Execute(defaultTargetExpression); } + + internal static IReadOnlyCollection ExecutableTargets { get; set; } + internal static IReadOnlyCollection ExecutionPlan { get; set; } - internal IReadOnlyCollection TargetDefinitions { get; set; } + internal void Execute() + where T : IBuildExtension + { + GetType().GetCustomAttributes().OfType().ForEach(x => x.Execute(this)); + } protected internal virtual IOutputSink OutputSink { From 157cb72f808455d6dec537c9e6193c1e121fbea1 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Thu, 3 Jan 2019 23:39:18 +0100 Subject: [PATCH 09/53] Add graph highlighting --- shell-completion.yml | 6 -- .../Nuke.Common/Execution/BuildExtensions.cs | 13 ---- source/Nuke.Common/Execution/GraphService.cs | 65 ++++++++++++++----- source/Nuke.Common/Execution/graph.html | 34 ++++++++-- 4 files changed, 78 insertions(+), 40 deletions(-) delete mode 100644 source/Nuke.Common/Execution/BuildExtensions.cs diff --git a/shell-completion.yml b/shell-completion.yml index b850b8a09..bdc9f1d82 100644 --- a/shell-completion.yml +++ b/shell-completion.yml @@ -17,10 +17,7 @@ Host: - Travis Root: Skip: -- A - Analysis -- B -- C - Changelog - Clean - Compile @@ -38,10 +35,7 @@ Solution: Source: SymbolSource: Target: -- A - Analysis -- B -- C - Changelog - Clean - Compile diff --git a/source/Nuke.Common/Execution/BuildExtensions.cs b/source/Nuke.Common/Execution/BuildExtensions.cs deleted file mode 100644 index fc7598b85..000000000 --- a/source/Nuke.Common/Execution/BuildExtensions.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018 Maintainers of NUKE. -// Distributed under the MIT License. -// https://github.com/nuke-build/nuke/blob/master/LICENSE - -using System; -using System.Linq; - -namespace Nuke.Common.Execution -{ - internal static class BuildExtensions - { - } -} diff --git a/source/Nuke.Common/Execution/GraphService.cs b/source/Nuke.Common/Execution/GraphService.cs index 665769854..3d797673c 100644 --- a/source/Nuke.Common/Execution/GraphService.cs +++ b/source/Nuke.Common/Execution/GraphService.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Reflection; using System.Text; +using Nuke.Common.Utilities.Collections; namespace Nuke.Common.Execution { @@ -28,18 +29,10 @@ string GetStringFromStream(Stream stream) var resourceName = typeof(BuildManager).Namespace + ".graph.html"; var resourceStream = assembly.GetManifestResourceStream(resourceName).NotNull("resourceStream != null"); - var graph = new StringBuilder(); - foreach (var executableTarget in executableTargets) - { - var dependentBy = executableTargets.Where(x => x.AllDependencies.Contains(executableTarget)).ToList(); - if (dependentBy.Count == 0) - graph.AppendLine(executableTarget.GetDeclaration()); - else - dependentBy.ForEach(x => graph.AppendLine($"{executableTarget.GetDeclaration()} --> {x.GetDeclaration()}")); - } - var path = Path.Combine(NukeBuild.TemporaryDirectory, "graph.html"); - var contents = GetStringFromStream(resourceStream).Replace("__GRAPH__", graph.ToString()); + var contents = GetStringFromStream(resourceStream) + .Replace("__GRAPH__", GetGraphDefinition(executableTargets)) + .Replace("__EVENTS__", GetEventsDefinition(executableTargets)); File.WriteAllText(path, contents); // Workaround for https://github.com/dotnet/corefx/issues/10361 @@ -50,11 +43,53 @@ string GetStringFromStream(Stream stream) }); } - private static string GetDeclaration(this ExecutableTarget executableTarget) + private static string GetGraphDefinition(IReadOnlyCollection executableTargets) { - return executableTarget.IsDefault - ? $"defaultTarget[{executableTarget.Name}]" - : executableTarget.Name; + var builder = new StringBuilder(); + foreach (var executableTarget in executableTargets) + { + var dependencies = executableTargets.Where(x => x.AllDependencies.Contains(executableTarget)).ToList(); + if (dependencies.Count == 0) + builder.AppendLine(executableTarget.Name); + else + { + foreach (var dependency in dependencies) + { + if (dependency.ExecutionDependencies.Contains(executableTarget)) + builder.AppendLine($"{executableTarget.Name} --> {dependency.Name}"); + else if (dependency.OrderDependencies.Contains(executableTarget)) + builder.AppendLine($"{executableTarget.Name} -.-> {dependency.Name}"); + else if (dependency.TriggerDependencies.Contains(executableTarget)) + builder.AppendLine($"{executableTarget.Name} ==> {dependency.Name}"); + } + } + } + + return builder.ToString(); + } + + private static string GetEventsDefinition(IReadOnlyCollection executableTargets) + { + var builder = new StringBuilder(); + builder.AppendLine($@" $(""#{executableTargets.Single(x => x.IsDefault).Name}"").find('rect').addClass('defaultTarget');"); + + foreach (var executableTarget in executableTargets) + { + var executionPlan = ExecutionPlanner.GetExecutionPlan(executableTargets, new[] { executableTarget.Name }); + builder + .AppendLine($@" $(""#{executableTarget.Name}"").hover(") + .AppendLine(" function() {"); + executionPlan.ForEach(x => builder.AppendLine($@" $(""#{x.Name}"").addClass('highlight');")); + builder + .AppendLine(" },") + .AppendLine(" function() {"); + executionPlan.ForEach(x => builder.AppendLine($@" $(""#{x.Name}"").removeClass('highlight');")); + builder + .AppendLine(" });"); + } + + + return builder.ToString(); } } } diff --git a/source/Nuke.Common/Execution/graph.html b/source/Nuke.Common/Execution/graph.html index 9ff1ca5e8..614e7cc8a 100644 --- a/source/Nuke.Common/Execution/graph.html +++ b/source/Nuke.Common/Execution/graph.html @@ -1,6 +1,10 @@ + @@ -45,9 +69,7 @@ graph TD __GRAPH__ -linkStyle default interpolate basis stroke-width:2px,fill:none,stroke:white; -classDef defaultTarget fill:#9f6,stroke:#333,stroke-width:2px; -class defaultTarget defaultTarget +linkStyle default interpolate basis From 30a6967dd282eef7bcfcb769dca8fa5732a63d4e Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Fri, 4 Jan 2019 14:00:20 +0100 Subject: [PATCH 10/53] Rename Graph to Plan --- shell-completion.yml | 2 +- ...Service.cs => ExecutionPlanHtmlService.cs} | 25 +++++++------------ .../Execution/HandleHelpRequestsAttribute.cs | 6 ++--- .../{graph.html => execution-plan.html} | 0 source/Nuke.Common/Nuke.Common.csproj | 4 +-- source/Nuke.Common/NukeBuild.Statics.cs | 8 +++--- 6 files changed, 19 insertions(+), 26 deletions(-) rename source/Nuke.Common/Execution/{GraphService.cs => ExecutionPlanHtmlService.cs} (82%) rename source/Nuke.Common/Execution/{graph.html => execution-plan.html} (100%) diff --git a/shell-completion.yml b/shell-completion.yml index bdc9f1d82..4fa3db8d9 100644 --- a/shell-completion.yml +++ b/shell-completion.yml @@ -4,7 +4,6 @@ Configuration: - Release Continue: GitterAuthToken: -Graph: Help: Host: - AppVeyor @@ -15,6 +14,7 @@ Host: - TeamCity - TeamServices - Travis +Plan: Root: Skip: - Analysis diff --git a/source/Nuke.Common/Execution/GraphService.cs b/source/Nuke.Common/Execution/ExecutionPlanHtmlService.cs similarity index 82% rename from source/Nuke.Common/Execution/GraphService.cs rename to source/Nuke.Common/Execution/ExecutionPlanHtmlService.cs index 3d797673c..225491e29 100644 --- a/source/Nuke.Common/Execution/GraphService.cs +++ b/source/Nuke.Common/Execution/ExecutionPlanHtmlService.cs @@ -9,30 +9,23 @@ using System.Linq; using System.Reflection; using System.Text; +using Nuke.Common.Utilities; using Nuke.Common.Utilities.Collections; namespace Nuke.Common.Execution { - internal static class GraphService + internal class ExecutionPlanHtmlService { - public static void ShowGraph(IReadOnlyCollection executableTargets) - { - string GetStringFromStream(Stream stream) - { - using (var reader = new StreamReader(stream, Encoding.UTF8)) - { - return reader.ReadToEnd(); - } - } - - var assembly = typeof(BuildManager).GetTypeInfo().Assembly; - var resourceName = typeof(BuildManager).Namespace + ".graph.html"; - var resourceStream = assembly.GetManifestResourceStream(resourceName).NotNull("resourceStream != null"); + private const string c_htmlFileName = "execution-plan.html"; - var path = Path.Combine(NukeBuild.TemporaryDirectory, "graph.html"); - var contents = GetStringFromStream(resourceStream) + public static void ShowPlan(IReadOnlyCollection executableTargets) + { + var resourceText = ResourceUtility.GetResourceText(c_htmlFileName); + var contents = resourceText .Replace("__GRAPH__", GetGraphDefinition(executableTargets)) .Replace("__EVENTS__", GetEventsDefinition(executableTargets)); + + var path = Path.Combine(NukeBuild.TemporaryDirectory, c_htmlFileName); File.WriteAllText(path, contents); // Workaround for https://github.com/dotnet/corefx/issues/10361 diff --git a/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs b/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs index 563cd8e38..258dd0b1e 100644 --- a/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs +++ b/source/Nuke.Common/Execution/HandleHelpRequestsAttribute.cs @@ -18,10 +18,10 @@ public void Execute(NukeBuild instance) Logger.Log(HelpTextService.GetParametersText(instance, NukeBuild.ExecutableTargets)); } - if (NukeBuild.Graph) - GraphService.ShowGraph(NukeBuild.ExecutableTargets); + if (NukeBuild.Plan) + ExecutionPlanHtmlService.ShowPlan(NukeBuild.ExecutableTargets); - if (NukeBuild.Help || NukeBuild.Graph) + if (NukeBuild.Help || NukeBuild.Plan) Environment.Exit(exitCode: 0); } } diff --git a/source/Nuke.Common/Execution/graph.html b/source/Nuke.Common/Execution/execution-plan.html similarity index 100% rename from source/Nuke.Common/Execution/graph.html rename to source/Nuke.Common/Execution/execution-plan.html diff --git a/source/Nuke.Common/Nuke.Common.csproj b/source/Nuke.Common/Nuke.Common.csproj index 5b83baba3..59d451f67 100644 --- a/source/Nuke.Common/Nuke.Common.csproj +++ b/source/Nuke.Common/Nuke.Common.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/source/Nuke.Common/NukeBuild.Statics.cs b/source/Nuke.Common/NukeBuild.Statics.cs index fd1df2744..1d2922925 100644 --- a/source/Nuke.Common/NukeBuild.Statics.cs +++ b/source/Nuke.Common/NukeBuild.Statics.cs @@ -29,7 +29,7 @@ static NukeBuild() Verbosity = ParameterService.Instance.GetParameter(() => Verbosity) ?? Verbosity.Normal; Host = ParameterService.Instance.GetParameter(() => Host) ?? GetHostType(); Continue = ParameterService.Instance.GetParameter(() => Continue); - Graph = ParameterService.Instance.GetParameter(() => Graph); + Plan = ParameterService.Instance.GetParameter(() => Plan); Help = ParameterService.Instance.GetParameter(() => Help); } @@ -69,10 +69,10 @@ static NukeBuild() public static HostType Host { get; } /// - /// Gets a value whether to show the target dependency graph (HTML). + /// Gets a value whether to show the execution plan (HTML). /// - [Parameter("Shows the target dependency graph (HTML).")] - public static bool Graph { get; } + [Parameter("Shows the execution plan (HTML).")] + public static bool Plan { get; } /// /// Gets a value whether to show the help text for this build assembly. From 662c60c971851d9555b383862e6251c3e1985f26 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Fri, 4 Jan 2019 14:30:34 +0100 Subject: [PATCH 11/53] Add ordering dependency for Clean to Restore --- build/Build.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/build/Build.cs b/build/Build.cs index 6bcbef09f..4cf2fcc1b 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -56,6 +56,7 @@ partial class Build : NukeBuild readonly string HotfixBranchPrefix = "hotfix"; Target Clean => _ => _ + .Before(Restore) .Executes(() => { DeleteDirectories(GlobDirectories(SourceDirectory, "*/bin", "*/obj")); From f14d7e4a3d6ed84b6de22ac8d13d65605f09bf4c Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Fri, 4 Jan 2019 16:51:38 +0100 Subject: [PATCH 12/53] Add TravisOutputSink --- source/Nuke.Common/NukeBuild.cs | 3 +++ .../OutputSinks/TravisOutputSink.cs | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 source/Nuke.Common/OutputSinks/TravisOutputSink.cs diff --git a/source/Nuke.Common/NukeBuild.cs b/source/Nuke.Common/NukeBuild.cs index 147ee900a..1d9e4f105 100644 --- a/source/Nuke.Common/NukeBuild.cs +++ b/source/Nuke.Common/NukeBuild.cs @@ -79,6 +79,9 @@ protected internal virtual IOutputSink OutputSink case HostType.Bitrise: innerOutputSink = new BitriseOutputSink(); break; + case HostType.Travis: + innerOutputSink = new TravisOutputSink(); + break; case HostType.TeamCity: innerOutputSink = new TeamCityOutputSink(new TeamCity()); break; diff --git a/source/Nuke.Common/OutputSinks/TravisOutputSink.cs b/source/Nuke.Common/OutputSinks/TravisOutputSink.cs new file mode 100644 index 000000000..53e9cb085 --- /dev/null +++ b/source/Nuke.Common/OutputSinks/TravisOutputSink.cs @@ -0,0 +1,26 @@ +// Copyright 2019 Maintainers of NUKE. +// Distributed under the MIT License. +// https://github.com/nuke-build/nuke/blob/master/LICENSE + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using JetBrains.Annotations; +using Nuke.Common.Utilities; + +namespace Nuke.Common.OutputSinks +{ + [UsedImplicitly] + [ExcludeFromCodeCoverage] + internal class TravisOutputSink : ConsoleOutputSink + { + public override IDisposable WriteBlock(string text) + { + Info(FigletTransform.GetText(text)); + + return DelegateDisposable.CreateBracket( + () => Write($"travis_fold:start:{text}"), + () => Write($"travis_fold:end:{text}")); + } + } +} From 99b61722383e4f6bfcd260d01ab76e0fad83ee7a Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Fri, 4 Jan 2019 16:52:54 +0100 Subject: [PATCH 13/53] Add Bitrise custom summary draft --- .../OutputSinks/BitriseOutputSink.cs | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/source/Nuke.Common/OutputSinks/BitriseOutputSink.cs b/source/Nuke.Common/OutputSinks/BitriseOutputSink.cs index d5d0902ec..0feba8516 100644 --- a/source/Nuke.Common/OutputSinks/BitriseOutputSink.cs +++ b/source/Nuke.Common/OutputSinks/BitriseOutputSink.cs @@ -19,5 +19,54 @@ public override IDisposable WriteBlock(string text) Info(FigletTransform.GetText(text, "ansi-shadow")); return DelegateDisposable.CreateBracket(); } + + // public override void WriteSummary(IReadOnlyCollection executionList) + // { + // string CreateLine(string target, string executionStatus, string duration) + // => new StringBuilder() + // .Append("| ") + // .Append(target.PadRight(42, ' ')) + // .Append(executionStatus.PadRight(19, paddingChar: ' ')) + // .Append((duration + " min").PadRight(15, paddingChar: ' ')) + // .Append(" |").ToString(); + // + // string ToMinutesAndSeconds(TimeSpan duration) + // => $"{(int) duration.TotalMinutes}:{duration:ss}"; + // + // Logger.Log("+------------------------------------------------------------------------------+"); + // Logger.Log("| build summary |"); + // Logger.Log("+---+---------------------------------------------------------------+----------+"); + // Logger.Log("| | target | time (s) |"); + // Logger.Log("+---+---------------------------------------------------------------+----------+"); + // + // + // Logger.Log("| Target Status Duration |"); + // Logger.Log("+" + new string(c: '-', count: 78) + "+"); + // + // foreach (var target in executionList) + // { + // var line = CreateLine(target.Name, target.Status.ToString(), ToMinutesAndSeconds(target.Duration)); + // switch (target.Status) + // { + // case ExecutionStatus.Absent: + // case ExecutionStatus.NotRun: + // case ExecutionStatus.Skipped: + // Logger.Trace(line); + // break; + // case ExecutionStatus.Executed: + // Logger.Success(line); + // break; + // case ExecutionStatus.Failed: + // Logger.Error(line); + // break; + // } + // } + // + // Logger.Log("+" + new string(c: '-', count: 78) + "+"); + // Logger.Log(CreateLine("Total", "", ToMinutesAndSeconds(executionList.Aggregate(TimeSpan.Zero, (t, x) => t.Add(x.Duration))))); + // Logger.Log("+---+---------------------------------------------------------------+----------+"); + // Logger.Log("| ✓ | Run build.sh | 130 sec |"); + // Logger.Log("+---+---------------------------------------------------------------+----------+"); + // } } } From 01dd5794d253e8fd0e1d73a929fe68b96d2eba31 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Fri, 4 Jan 2019 17:33:44 +0100 Subject: [PATCH 14/53] Update repository identifier --- CHANGELOG.md | 62 +++++++++++----------- source/Nuke.CodeGeneration/Model/Tool.cs | 2 +- source/Nuke.CodeGeneration/schema.json | 2 +- source/Nuke.GlobalTool/Program.Setup.cs | 8 +-- source/Nuke.GlobalTool/templates/README.md | 35 +++--------- 5 files changed, 43 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b3420ea4..4160daa9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -252,35 +252,35 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Added CLT tasks for Git - Fixed background color in console output -[vNext]: https://github.com/nuke-build/nuke/compare/0.14.1...HEAD -[0.14.1]: https://github.com/nuke-build/nuke/compare/0.14.0...0.14.1 -[0.14.0]: https://github.com/nuke-build/nuke/compare/0.13.0...0.14.0 -[0.13.0]: https://github.com/nuke-build/nuke/compare/0.12.4...0.13.0 -[0.12.4]: https://github.com/nuke-build/nuke/compare/0.12.3...0.12.4 -[0.12.3]: https://github.com/nuke-build/nuke/compare/0.12.2...0.12.3 -[0.12.2]: https://github.com/nuke-build/nuke/compare/0.12.1...0.12.2 -[0.12.1]: https://github.com/nuke-build/nuke/compare/0.12.0...0.12.1 -[0.12.0]: https://github.com/nuke-build/nuke/compare/0.11.1...0.12.0 -[0.11.1]: https://github.com/nuke-build/nuke/compare/0.11.0...0.11.1 -[0.11.0]: https://github.com/nuke-build/nuke/compare/0.10.5...0.11.0 -[0.10.5]: https://github.com/nuke-build/nuke/compare/0.10.4...0.10.5 -[0.10.4]: https://github.com/nuke-build/nuke/compare/0.10.3...0.10.4 -[0.10.3]: https://github.com/nuke-build/nuke/compare/0.10.2...0.10.3 -[0.10.2]: https://github.com/nuke-build/nuke/compare/0.10.1...0.10.2 -[0.10.1]: https://github.com/nuke-build/nuke/compare/0.10.0...0.10.1 -[0.10.0]: https://github.com/nuke-build/nuke/compare/0.9.1...0.10.0 -[0.9.1]: https://github.com/nuke-build/nuke/compare/0.9.0...0.9.1 -[0.9.0]: https://github.com/nuke-build/nuke/compare/0.8.0...0.9.0 -[0.8.0]: https://github.com/nuke-build/nuke/compare/0.7.0...0.8.0 -[0.7.0]: https://github.com/nuke-build/nuke/compare/0.6.2...0.7.0 -[0.6.2]: https://github.com/nuke-build/nuke/compare/0.6.1...0.6.2 -[0.6.1]: https://github.com/nuke-build/nuke/compare/0.6.0...0.6.1 -[0.6.0]: https://github.com/nuke-build/nuke/compare/0.5.3...0.6.0 -[0.5.3]: https://github.com/nuke-build/nuke/compare/0.5.2...0.5.3 -[0.5.2]: https://github.com/nuke-build/nuke/compare/0.5.0...0.5.2 -[0.5.0]: https://github.com/nuke-build/nuke/compare/0.4.0...0.5.0 -[0.4.0]: https://github.com/nuke-build/nuke/compare/0.3.1...0.4.0 -[0.3.1]: https://github.com/nuke-build/nuke/compare/0.2.10...0.3.1 -[0.2.10]: https://github.com/nuke-build/nuke/compare/0.2.0...0.2.10 -[0.2.0]: https://github.com/nuke-build/nuke/tree/0.2.0 +[vNext]: https://github.com/nuke-build/common/compare/0.14.1...HEAD +[0.14.1]: https://github.com/nuke-build/common/compare/0.14.0...0.14.1 +[0.14.0]: https://github.com/nuke-build/common/compare/0.13.0...0.14.0 +[0.13.0]: https://github.com/nuke-build/common/compare/0.12.4...0.13.0 +[0.12.4]: https://github.com/nuke-build/common/compare/0.12.3...0.12.4 +[0.12.3]: https://github.com/nuke-build/common/compare/0.12.2...0.12.3 +[0.12.2]: https://github.com/nuke-build/common/compare/0.12.1...0.12.2 +[0.12.1]: https://github.com/nuke-build/common/compare/0.12.0...0.12.1 +[0.12.0]: https://github.com/nuke-build/common/compare/0.11.1...0.12.0 +[0.11.1]: https://github.com/nuke-build/common/compare/0.11.0...0.11.1 +[0.11.0]: https://github.com/nuke-build/common/compare/0.10.5...0.11.0 +[0.10.5]: https://github.com/nuke-build/common/compare/0.10.4...0.10.5 +[0.10.4]: https://github.com/nuke-build/common/compare/0.10.3...0.10.4 +[0.10.3]: https://github.com/nuke-build/common/compare/0.10.2...0.10.3 +[0.10.2]: https://github.com/nuke-build/common/compare/0.10.1...0.10.2 +[0.10.1]: https://github.com/nuke-build/common/compare/0.10.0...0.10.1 +[0.10.0]: https://github.com/nuke-build/common/compare/0.9.1...0.10.0 +[0.9.1]: https://github.com/nuke-build/common/compare/0.9.0...0.9.1 +[0.9.0]: https://github.com/nuke-build/common/compare/0.8.0...0.9.0 +[0.8.0]: https://github.com/nuke-build/common/compare/0.7.0...0.8.0 +[0.7.0]: https://github.com/nuke-build/common/compare/0.6.2...0.7.0 +[0.6.2]: https://github.com/nuke-build/common/compare/0.6.1...0.6.2 +[0.6.1]: https://github.com/nuke-build/common/compare/0.6.0...0.6.1 +[0.6.0]: https://github.com/nuke-build/common/compare/0.5.3...0.6.0 +[0.5.3]: https://github.com/nuke-build/common/compare/0.5.2...0.5.3 +[0.5.2]: https://github.com/nuke-build/common/compare/0.5.0...0.5.2 +[0.5.0]: https://github.com/nuke-build/common/compare/0.4.0...0.5.0 +[0.4.0]: https://github.com/nuke-build/common/compare/0.3.1...0.4.0 +[0.3.1]: https://github.com/nuke-build/common/compare/0.2.10...0.3.1 +[0.2.10]: https://github.com/nuke-build/common/compare/0.2.0...0.2.10 +[0.2.0]: https://github.com/nuke-build/common/tree/0.2.0 diff --git a/source/Nuke.CodeGeneration/Model/Tool.cs b/source/Nuke.CodeGeneration/Model/Tool.cs index 3ff0e3259..1a39e86f6 100644 --- a/source/Nuke.CodeGeneration/Model/Tool.cs +++ b/source/Nuke.CodeGeneration/Model/Tool.cs @@ -19,7 +19,7 @@ namespace Nuke.CodeGeneration.Model public class Tool : IDeprecatable { [JsonProperty("$schema")] - public string Schema { get; set; } = "https://raw.githubusercontent.com/nuke-build/nuke/master/source/Nuke.CodeGeneration/schema.json"; + public string Schema { get; set; } = "https://raw.githubusercontent.com/nuke-build/common/master/source/Nuke.CodeGeneration/schema.json"; [JsonIgnore] public string SpecificationFile { get; set; } [JsonIgnore] public string DefaultOutputFile => Path.ChangeExtension(SpecificationFile, "Generated.cs"); diff --git a/source/Nuke.CodeGeneration/schema.json b/source/Nuke.CodeGeneration/schema.json index 799a014ff..e11384037 100644 --- a/source/Nuke.CodeGeneration/schema.json +++ b/source/Nuke.CodeGeneration/schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "id": "https://raw.githubusercontent.com/nuke-build/nuke/master/source/Nuke.CodeGeneration/schema.json", + "id": "https://raw.githubusercontent.com/nuke-build/common/master/source/Nuke.CodeGeneration/schema.json", "title": "Tool specification schema file by NUKE", "definitions": { "DataClass": { diff --git a/source/Nuke.GlobalTool/Program.Setup.cs b/source/Nuke.GlobalTool/Program.Setup.cs index 368f19a17..8c5aaa074 100644 --- a/source/Nuke.GlobalTool/Program.Setup.cs +++ b/source/Nuke.GlobalTool/Program.Setup.cs @@ -302,16 +302,16 @@ private static int Setup(string[] args, [CanBeNull] string rootDirectory, [CanBe TextTasks.WriteAllText( $"{solutionFile}.DotSettings.ext", - "https://raw.githubusercontent.com/nuke-build/nuke/develop/nuke-common.sln.DotSettings"); + "https://raw.githubusercontent.com/nuke-build/common/develop/nuke-common.sln.DotSettings"); TextTasks.WriteAllText( Path.Combine(solutionDirectory, "source", "Inspections.DotSettings.ext"), - "https://raw.githubusercontent.com/nuke-build/nuke/develop/source/Inspections.DotSettings"); + "https://raw.githubusercontent.com/nuke-build/common/develop/source/Inspections.DotSettings"); TextTasks.WriteAllText( Path.Combine(solutionDirectory, "source", "CodeStyle.DotSettings.ext"), - "https://raw.githubusercontent.com/nuke-build/nuke/develop/source/CodeStyle.DotSettings"); + "https://raw.githubusercontent.com/nuke-build/common/develop/source/CodeStyle.DotSettings"); TextTasks.WriteAllText( Path.Combine(solutionDirectory, "source", "Configuration.props.ext"), - "https://raw.githubusercontent.com/nuke-build/nuke/develop/source/Configuration.props"); + "https://raw.githubusercontent.com/nuke-build/common/develop/source/Configuration.props"); } #endregion diff --git a/source/Nuke.GlobalTool/templates/README.md b/source/Nuke.GlobalTool/templates/README.md index f54aa32a6..bfd0583b7 100644 --- a/source/Nuke.GlobalTool/templates/README.md +++ b/source/Nuke.GlobalTool/templates/README.md @@ -1,34 +1,11 @@ - +# About This Project -[![NuGet Release](https://img.shields.io/nuget/v/_PACKAGE_NAME_.svg?label=release&colorB=0A7BBB&style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABfWlDQ1BJQ0MgUHJvZmlsZQAAKM%2BlkLFLw0AYxV9bi1IrBRVxcMhQHKQFqYuj1qEgpZRawapLkyatkLQhSRFxdHDt0EXFxSr%2BB7qJ%2F4AgCOokiM4OCiJIie%2BaQkF0EL9w9%2F14d%2B9y9wB%2FQ1cMu28aMKqOlUslpZXCqtT%2FCD%2FGMIwQgkXFNuez2TR%2Brfdb%2BES%2FiYuz8LcaLKm2AvgGyLOKaTnkOXJm0zEFN8ijSqVYIh%2BTYxYvSL4Wuuzxs%2BCyxx%2BCrXxugW8Lk6WyxzHBssfiLZJSsQyyTo4ael3p3ke8JKxWl5fYJzrDRg4pJCFBRh0b0OEgzl5lZj%2F7Eh1fBjV6FM4mtmDRUUaF3hjVOk9V2TXqKj%2BdO1gi%2B%2B%2BZ2tpMwvtDeBEIPrnu2xTQfwC0d13388h12y0gcA9cNnv%2BWpNxvlBv9LToIRDZAc4uepp8Apwz4%2FEHs2gVO1KAw69pwOspMFQARph1aO2%2F617e3XW07oD8NpC%2BAvb2gUnuj6x%2FAbvNdIz349ECAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAAGXRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjEwrQoKwAAABeBJREFUaEPdmV1oHFUUx5ukTWo%2FYkuVmtaXFqVoK8UHwVo%2FEBURlFJ88U3FUmmriCgiiFSkiuKDggo%2B6ENRqraCWvwA7Ye0IMVGTHHbajQEI2matrKb3Wzm487M%2Bjszxy2bbpKZ3dnu1j8Mc%2BfOuf9zzr3nnrn3zqz%2FLQ4ePDi7VCp16OOlB4xf7Dj%2Bq8Z4fcaYXx3ff5O6q%2FT1pYGsZa3wff%2BI7wc%2BxocIgoAq%2Fxj3FSrW2sDmTuP7b2OwiVw4D%2Bo8rh0U56p466JQCJbS84ci0y%2BE5%2FkHxsfHe1S8dUGPL%2BM6onZfAI%2BQKxaLV6t46wJbF%2BDIp1xBZPp5SB1ht5Pi5Sre2rBtcx%2FhNRSZfx7UDZPB7qbYpqKtjd7e3jl0%2FjrHdb%2FDeDKvz0D4h3HiHpyYo2KXBqTXM5lM5%2Bjo6ALKcnUmHQnk5WM6j07pzufzVxaDYDnlpNeysbGxJdwXDg0NXQbfxfs4o2yRjB7KdzCSB8h0IzKq1CcGHGRKT6JiwHXdva7nPcX9Jl417hMA%2BWzm10aUf4Pis2JE2oCTxOkPGuPvorxWVacHdHTSc8%2Bi5AwK0vdgElDhc51gdG7hMZ3kA9Ecx%2FEew4liqOUigrAdyE%2B4t1KszxkhoFeebIYT%2F0FCDRvWq0m1gUl9J0SnlDMEz77rep87jvMww%2F%2BA7YYh1yvhoCKpg7A%2Bms%2BXrlCzkmFwsDTXcb09GFmeE5TPFW17A0Z38djO1SZ7Gp5lDfcR95qy10yAewLuTWpaMkgahGBQucpOUGxXkQpQP08cD4UbAPR%2FgTNLVF080K7dstwtNPYimpBoJ0TdKlIV4%2BNBDxM0p01SBXn5FOF8o6qKh%2F7%2B%2Fi7XmPeVQ9Ih3yrvGYozZg8Ufh%2B1ShfY4NvGPEixakRUxTBhwgjsiyhCEgdHntDX02LCchsWXtjwPLf460EMn288ry9qHvUGeJnibBWpCt63EVrHwkYNAF%2F8t%2Fr7gy5VNzPOng0WYtCf2j4EIXOIheG0m66CMXdJGGqT1AH3e1zxHUF4ISNQ4QhrBo%2BJ8jTFqivUQpSCT0bSjUEqjggkvnDoDbLHavlAIdfN1WMZcy%2Fx%2BzPlhq7DoE%2FHEYEYC%2F4m1Pbj1F48%2B5HqhqTcyUBveo40Ey3jCJxydpYlkfxGKH7NqO4lO2aoP0e9pWJToiUcET7S5%2BvydeaxnMYpt43mctfg2DYc%2B4lwnXK91lRH4JLrS93CTrkn5127HQTXsl77DN1VV9JNdYRk8AujsIZirM1RLpdbjO4DUetKNM0ReCz2LluUNjbkRAb9I0pTRtMcgSPzFz2stLFB03bPC17AjohI0TRHLMd5TSkTw3WD25n8WaUK0TRHTBBsUMrEkHlFBvtDqUIkdoQ2C4zxjkfNa4cbBOuUMjHIYKsYkRNKFYLOfSepI7IfmfI%2FSlywNd6olImBwauxoWJE%2BA69xC3%2BfgThuRDtClvXAcsydcwR9zY%2BknmlCsGce4Rb%2FPNhESZtPoczda1mMeT4yMjIfKWNDZq227Yru8EyCLMxEsDNKhIfeqZ1RnlqAv0wIaeUFOPvs0HOslZODisc%2BaFYnH5jVxVy3M9Gan89QyIj6vlBX6HgrFHaGUGTbqKh4gCDOjn8eJHitFvtKWFZcuYbFCK62iDOGI9tcjFYzuOUI8O7ttOnTy%2FFYDkULB9DCbBhGJpVKpocmUypk0n3ASQVxLWApfswa%2Fittm1fl81mF1HVIaeUcj7A%2Bn2lbcwGZA6jq2LByHOBdc7jalLtkEUcZO%2Bm4QwcfCODk%2FT4t9w%2FZh5%2BQvkrWVgyByZUrAzeZenIbRTT%2BZMlv9Zs1%2F1QDIlUNB44kSfMNg%2Bm%2FfdKQsAx%2FisoGMGhhh35wG8xOgMsUR7avXt34%2F4p%2FlMo3CAZBIX7CIkh7nWNEp0SGs%2F9d%2BbInqLlbpUzZFXXWKC%2Fgyy0jF5biwF3MFE34twm6jcnuRzPe5TJfz9rsvXwXJ8rlRZTX9%2FfqXqwfft2%2BVfSUeOV0PBZs%2F4F1CRqhBU78vgAAAAASUVORK5CYII%3D)](https://www.nuget.org/packages/_PACKAGE_NAME_/) -[![NuGet Prerelease](https://img.shields.io/nuget/vpre/_PACKAGE_NAME_.svg?label=prerelease&style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABfWlDQ1BJQ0MgUHJvZmlsZQAAKM%2BlkLFLw0AYxV9bi1IrBRVxcMhQHKQFqYuj1qEgpZRawapLkyatkLQhSRFxdHDt0EXFxSr%2BB7qJ%2F4AgCOokiM4OCiJIie%2BaQkF0EL9w9%2F14d%2B9y9wB%2FQ1cMu28aMKqOlUslpZXCqtT%2FCD%2FGMIwQgkXFNuez2TR%2Brfdb%2BES%2FiYuz8LcaLKm2AvgGyLOKaTnkOXJm0zEFN8ijSqVYIh%2BTYxYvSL4Wuuzxs%2BCyxx%2BCrXxugW8Lk6WyxzHBssfiLZJSsQyyTo4ael3p3ke8JKxWl5fYJzrDRg4pJCFBRh0b0OEgzl5lZj%2F7Eh1fBjV6FM4mtmDRUUaF3hjVOk9V2TXqKj%2BdO1gi%2B%2B%2BZ2tpMwvtDeBEIPrnu2xTQfwC0d13388h12y0gcA9cNnv%2BWpNxvlBv9LToIRDZAc4uepp8Apwz4%2FEHs2gVO1KAw69pwOspMFQARph1aO2%2F617e3XW07oD8NpC%2BAvb2gUnuj6x%2FAbvNdIz349ECAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAAGXRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjEwrQoKwAAABeBJREFUaEPdmV1oHFUUx5ukTWo%2FYkuVmtaXFqVoK8UHwVo%2FEBURlFJ88U3FUmmriCgiiFSkiuKDggo%2B6ENRqraCWvwA7Ye0IMVGTHHbajQEI2matrKb3Wzm487M%2Bjszxy2bbpKZ3dnu1j8Mc%2BfOuf9zzr3nnrn3zqz%2FLQ4ePDi7VCp16OOlB4xf7Dj%2Bq8Z4fcaYXx3ff5O6q%2FT1pYGsZa3wff%2BI7wc%2BxocIgoAq%2Fxj3FSrW2sDmTuP7b2OwiVw4D%2Bo8rh0U56p466JQCJbS84ci0y%2BE5%2FkHxsfHe1S8dUGPL%2BM6onZfAI%2BQKxaLV6t46wJbF%2BDIp1xBZPp5SB1ht5Pi5Sre2rBtcx%2FhNRSZfx7UDZPB7qbYpqKtjd7e3jl0%2FjrHdb%2FDeDKvz0D4h3HiHpyYo2KXBqTXM5lM5%2Bjo6ALKcnUmHQnk5WM6j07pzufzVxaDYDnlpNeysbGxJdwXDg0NXQbfxfs4o2yRjB7KdzCSB8h0IzKq1CcGHGRKT6JiwHXdva7nPcX9Jl417hMA%2BWzm10aUf4Pis2JE2oCTxOkPGuPvorxWVacHdHTSc8%2Bi5AwK0vdgElDhc51gdG7hMZ3kA9Ecx%2FEew4liqOUigrAdyE%2B4t1KszxkhoFeebIYT%2F0FCDRvWq0m1gUl9J0SnlDMEz77rep87jvMww%2F%2BA7YYh1yvhoCKpg7A%2Bms%2BXrlCzkmFwsDTXcb09GFmeE5TPFW17A0Z38djO1SZ7Gp5lDfcR95qy10yAewLuTWpaMkgahGBQucpOUGxXkQpQP08cD4UbAPR%2FgTNLVF080K7dstwtNPYimpBoJ0TdKlIV4%2BNBDxM0p01SBXn5FOF8o6qKh%2F7%2B%2Fi7XmPeVQ9Ih3yrvGYozZg8Ufh%2B1ShfY4NvGPEixakRUxTBhwgjsiyhCEgdHntDX02LCchsWXtjwPLf460EMn288ry9qHvUGeJnibBWpCt63EVrHwkYNAF%2F8t%2Fr7gy5VNzPOng0WYtCf2j4EIXOIheG0m66CMXdJGGqT1AH3e1zxHUF4ISNQ4QhrBo%2BJ8jTFqivUQpSCT0bSjUEqjggkvnDoDbLHavlAIdfN1WMZcy%2Fx%2BzPlhq7DoE%2FHEYEYC%2F4m1Pbj1F48%2B5HqhqTcyUBveo40Ey3jCJxydpYlkfxGKH7NqO4lO2aoP0e9pWJToiUcET7S5%2BvydeaxnMYpt43mctfg2DYc%2B4lwnXK91lRH4JLrS93CTrkn5127HQTXsl77DN1VV9JNdYRk8AujsIZirM1RLpdbjO4DUetKNM0ReCz2LluUNjbkRAb9I0pTRtMcgSPzFz2stLFB03bPC17AjohI0TRHLMd5TSkTw3WD25n8WaUK0TRHTBBsUMrEkHlFBvtDqUIkdoQ2C4zxjkfNa4cbBOuUMjHIYKsYkRNKFYLOfSepI7IfmfI%2FSlywNd6olImBwauxoWJE%2BA69xC3%2BfgThuRDtClvXAcsydcwR9zY%2BknmlCsGce4Rb%2FPNhESZtPoczda1mMeT4yMjIfKWNDZq227Yru8EyCLMxEsDNKhIfeqZ1RnlqAv0wIaeUFOPvs0HOslZODisc%2BaFYnH5jVxVy3M9Gan89QyIj6vlBX6HgrFHaGUGTbqKh4gCDOjn8eJHitFvtKWFZcuYbFCK62iDOGI9tcjFYzuOUI8O7ttOnTy%2FFYDkULB9DCbBhGJpVKpocmUypk0n3ASQVxLWApfswa%2Fittm1fl81mF1HVIaeUcj7A%2Bn2lbcwGZA6jq2LByHOBdc7jalLtkEUcZO%2Bm4QwcfCODk%2FT4t9w%2FZh5%2BQvkrWVgyByZUrAzeZenIbRTT%2BZMlv9Zs1%2F1QDIlUNB44kSfMNg%2Bm%2FfdKQsAx%2FisoGMGhhh35wG8xOgMsUR7avXt34%2F4p%2FlMo3CAZBIX7CIkh7nWNEp0SGs%2F9d%2BbInqLlbpUzZFXXWKC%2Fgyy0jF5biwF3MFE34twm6jcnuRzPe5TJfz9rsvXwXJ8rlRZTX9%2FfqXqwfft2%2BVfSUeOV0PBZs%2F4F1CRqhBU78vgAAAAASUVORK5CYII%3D)](https://www.nuget.org/packages/_PACKAGE_NAME_/) -[![Downloads](https://img.shields.io/nuget/dt/_PACKAGE_NAME_.svg?label=downloads&style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY%2Fl8WUAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAABrUlEQVR4XuXQQW7DMAxE0Rw1R%2BtN3XAjBOpPaptfsgkN8DazIDB8bNu2NCxXguVKsFwJlrJs6KYGS1k2dFODpSwbuqnBUpYN3dRgKcuGbmqwlGVDNzVYyrKhmxosZdnQTQ2WsmzopgZLWTZ0U4OlLBu6qcFSlg3d1GApy4ZuarCUZUM3NVjKsqGbGixl2dBNDZaybOimBktZNnRTg6UsG7qpwVKWDd3UYPnB86VKfl5owx9YflHhCbvHByz%2FcecnHBofsNzhjk84PD5gudOdnnBqfMDygDs84fT4gOVBVz4hNT5gecIVT0iPD1ieNPMJyviAZcKMJ2jjA5ZJI5%2Bgjg9YCkY8QR8fsJSYTxgyPmApMp4wbHzAUpZ5wtDxAcsBzjxh%2BPiA5SBHnjBlfMByoD1PmDY%2BYDnYtydMHR%2BwnICeMH18wHKS9ydcMj5gOVE84bLxAcuVYLkSLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLDvVQ5saLFeC5UqwXAmW69gev7WIMc4gs9idAAAAAElFTkSuQmCC)](https://www.nuget.org/packages/_PACKAGE_NAME_/) +This project contains ... +# About NUKE -[![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg?style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAGoAAABsCAYAAACCeCeKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa%2F1AAAEQ0lEQVR4Xu2OAWrkQBAD7%2F%2FPywvyk9ztQUx7VrHV0thWYAqKgLZ64j9fX1%2FLXyAcl3nCcZknHJd5wnGZJxyXecJxmSccl3nCcZknHJd5wnGZJxyLM7nqXYX6Lb9COBZnctW7LvW7YoXj4CyueHM29RujhCNwBrPfu5L6rRHC8UCHWe%2FcSf3mR4XjiSoz3niC%2Bt2PCUfSLs5tAvX7bxeODTuodyP1nSOvAP2fW4Rjww4z7mbogt68XDg2ZXFvrlDl7a2Pj49%2Ff973WcKxKUv3pvZXq3D0DvrNEo5NWbo3tb9DhaN30G%2BycBRkcPo77XJ0P%2F4mC0dBBqe%2F2y5H9%2BNvknAUZHD6J%2Bxwdjv%2B3haOggxO%2F5Qdzm7H31vCUZDB6Z%2BUhbkbG1o4CjI4%2FdOyMHdjQwlHQQanf9oOzF1tKOEoyOD0CbKwd2N3KBwFGZw%2BRYbOzdj%2BKBwFGZw%2BRRb2pnaHwlGQwemTZOj0tf1ROAoyOH2SDJ2bsYXCUZDB6dNk6PS1hcJRkMHp02To9LWFwlGQwenTZHD6N%2BEoyOD0iZ7h9jvhKMjg9IkydPravglHQQanT5TB6XfCUZDB6RNlcPqdcBRkcPpEGZx%2BJxwFGZw%2BUQan3wlHQQanT5TB6XfCUZDB6RNl6dzUdiccBRmcPlGWzk1td8JRkMHpE2Xp3NR2JxwFGZw%2BUZbOTW13wlGQwekTZene1H4TjoIMTp8oS%2Fem9ptwFGRw%2BkRZuje134SjIIPTJ8rSvan9JhwFGZw%2BUZbuTe034SjI4PSJsnRvar8JR0EGp0%2BUpXtT%2B004CjI4faIs3Zvab8JRkMHpE2Xo3oz9JhwFGZw%2BUYbuzdhvwlGQwekTZXD6nXAUZHD6RBmcficcBRmcPlEGp98JR0EGp0%2BUwel3wlGQwekTZej0tX0TjoIMTp%2FoGW6%2FE46CDE6f6BlqC4WjIIPTp8nQ6WsLhaMgg9OneUanH1soHAUZnD5Jhs7N2ELhKMjg9EkysH3tDoWjIIPTp8jQuRnbH4WjIIPTp8jA3ozdoXAUZHD6BBnYm7E7FY6CDE6fIAN7M3anwlGQwemfloG9Q92pcBRkcPonZWHuxoYWjoIMTv%2BULMwtamjhKMjg9E%2FIwtyipiUcBRm6%2FYt6c6cszC1q2sJRkKHbv6g3d8mCbl9W0O%2BScBRk6PYv6s0dsqDblxX0uywcm7K4N1faAd2%2FrKDfLeHYlEW5eVHvZtsFvfHtC7RPEY5NWZSbb%2Bqtqwp667%2Bfn5%2F%2F%2FuDfZgnHhh3UuwTqtz8iHEm7OLdPUr%2F7MeFIqODeP0H95keF44EOs965g%2FqtEcIROIPZ711F%2Fc4Y4Tg4iyvenEX9tkjhWJzJVe861G%2BKFo5FBnTnehXof%2F0K4bjME47LPOG4zBOOyzzhuMwTjss84bjME47LPOG4zBOOyzzhuMwTjss84bjME47LPOG4zBOOyzS%2F%2FvwFjF3BUCE0pDMAAAAASUVORK5CYII%3D)](http://nuke.build) -[![Slack](https://img.shields.io/badge/slack-nukebuildnet-red.svg?style=flat-square&colorB=F5015F&logo=%20data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM%2FrhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAAD0ElEQVRYR8WYaYhNYRzGx5JlKKJM2eODZVJElqRRQrJElkyKxAeNMqQYW5IPZkpk%2FaBkLI1IkkiTQpTJiJQaEVlCJDGWJoMZv%2Fe8z1wd7zlzzrn36v7q6dzz%2Fz%2FP%2F32ne%2Bbcc29etmlubp6MbjQ1NX1At9FUtXIPmxmLGtlgCs5%2Fogmy5BY2UqV9%2BaB%2BTpbcwkZuak8%2BqH%2Fl0Em27MLwwWgpmh21CJ6D3o4CoDdTtuzB0C3ot9YwizxBA9R2oDdNVgd6R2TzoNQVLURlyrVRKx6ExhFyoH5JFgd6HVG9rD6ov%2BWQz3EeOoO%2B246F8%2BMaEw8C25X1Qb0R9ZDNgd5pWR3o%2BTb1L%2FSna0w0%2BMtszIVBy2RzoFcsW2LIVmhMNPhH25gLg87LloJyO%2BpFHCs9UxqQ36Fx0eBvQ%2BCVjfqh%2Fg115qXxjEd70RvbTQ%2Fyv9AILR8PAgeUd6B3Dj3XaUYwpx6FXjahEJqiGVmH2Q3oAipGXbRkMggWop%2BamTWYuY5DNy2TDIIDGbAB3fOm%2FQeYvVzLxYfQTFSDmjQnbRjxG4X%2BgfQuaNl4EDCby2hjJg%2B1aD3qR8n8h7%2BwXT%2FUvbuAlo8G821lE0O2Dm3i5SCNS0F9n3W50JsjWzT4P9tYclhoq8Y40Au9C9A7Kpvx9UZr0BV0GS1Sy0KhRrnEkL2rMQ60O9D%2FZJ1%2BqL9Dq3hpvh6knphaoLZeY7wNmmswyPQS7UZjUOBlYHKor0Y50DslayLIfUF%2Fr1NOZqDr6CHajybiSz2jcb7BRl3orZbNgd4S2dJhpMZEw0JDFHKgd1U2D847o%2Fm0znJs9RErDHLmnSnQyHgQqFPeB3XzjFiAZqGT6ItaacOMKi0bH0K7lHeg90MvM8LMQcdQ8s9nQoFfAzKFueYdqEYrUOjTeijMaEvQPPeF3ngzgbmFWio%2B5MxH1SiO5Ryz8twXBvNXatl4kBlK6L6NZwZzzH%2FjLbRTJQd6F7V0NPjbE3hso%2BmhTZkfjtaiPppr3pFn1uGHurkV5XsbiAKzuUGnDflDHPprnA96e6wrkLmytQ5DpiuQLuUa5UDP%2FDQXCOselq11MPZEDcoFQv8B8v3M1gL1RxrlQNtcPh%2Bt06FStmgYUop8D7Ccms%2FobWiIPNVqBTHUGxQAOXMJOFBfLEs8CExCFWgjGq5yCmolmh1EmWwO9LqTvWNtFs5PcEj241EUDO2LAr8mUK6RLRAs5q1egMyXsyKVsw%2FDa%2B2W%2FFBvkCW3sJHN2pMP6k9lyS1spBd6r32loFYiS%2B5hM8PQNWR%2B%2FHmNStXKAnl5fwAgRCOjsreHTAAAAABJRU5ErkJggg%3D%3D)](https://slofile.com/slack/nukebuildnet) -[![Twitter](https://img.shields.io/badge/twitter-%40nukebuildnet-blue.svg?style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY%2Fl8WUAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa%2F1AAAGlUlEQVR4Xu2ce4gVVRzHV9NdLXddUQzLUAoMLN2lh1FUmNgflYUPsAcFC0UJW1T0h%2BUDoowwEoMeUkRamQamCVmBaRpRRERGmPZPYBalpKVlYj52%2B3zv%2BXld995dZ%2B7O3DNzZz7w5cydOef3ODp7Zs6cmbqcnJycnJycnBzvdHZ2nt3R0XEJuhHNQDPRNPZfSzlOx61qzknolAHWYSvZPkB5grIE9h%2BnOIBWoKnoLDMRGtr2s830oiTQdDpmB2UoaCO2szndzAWCNo3oMdrpH6HnTqTScNtMJMR3HlqPOtQhfQETH6BRZroEqvRHY6mzCO1DJ9AUO1wKleup8CO6y3YlCuKahH5R8lGBvZ%2FRFeaiAL%2BHo9vRZnTUqqruZor%2BVq0UKtxhFY%2Bgu213IiCeG9A%2Fii9qsHuQ4nHKuUid9rc7cgr2HaFotXDKQ6WNrnqhwVF0jx3yCnFMRErSG%2Fh%2FysIpD3WGqdNcdQe%2Fj1G0WRUvEEMT2uki8gP%2B11L0fOoKKkwu1O4GjfWH80E2ezcQA%2Fjsh%2B%2FnCoF4Av8bUIOFVBhY%2BD0K3Wy7HOyY45qUwjF14iI2B1j1qoDPceiwi6K6WM5vowZ%2BDqS8CN2HNqFDaIaF6WDH065peTguVrM5xJrEDv6WOe%2FVB9%2BfoHY2V1DuQl1H48UW4inYucSO9wr1tqGLrVls4KMRd7p7SBTE9R5F6ZnIgcWuypmhrob5NhTbbQ0%2BZhacJQhi2kIxyEI8HQ7Od9WCQX2xjs2xZiJSsP2S85QMiOcLiqEWXilUuNNVDQftDqIn2OzZeAVgc5Pz4B%2FFgpostPJQr5VKFd9f0vRXivtRJIMM9kJPFEQNMWgkfgMVL2N6hPoaqve7ppWDDd1bPsTmMDNdEdjQP4g38K%2FOe5jN4Ne%2FNHjdNY8Ezc%2B9iFrYDjXYUF8Xq78XrHgC%2F4fRSAspGDTQbEefp4m6InvwHZqHJrKr%2FCjWDepGOusSFvzrSiPcWUQD3ToVJxSiBts6LXSKv8PPNspLKZtRyQwx%2B75B3iC2%2FajRwgkOjS5DmrqJHfxoCl6n%2Bk70PnoWtSM9z%2FjM1fID%2FvdQBDpbSqDhkwUrGYYO1J%2BQyu79adyAPnSmsgn567lJ8MGPylNpVLxY5PdQtBVlEvriU%2BuKYNBgC9qDnkdXoSbsDKFcjSIdmdMAKb9pXRMMGqyytmqs0VKj0FdoOdpthzIDOS%2B0rgkGDXqdD8wgoZ4bqwNnW8PMQ18cQ%2BHmPGlwvhqajUxDP%2ByjCH8NSMP1zkS2oR82WpeEg4bXoMyNuN2hC%2BZZl4SHxh%2BbnSxzuXVHeOjAFvSfGcoc5K55yIqXv52ckXkGZfJUJu1XrCsqBztapbXGmcwO%2Bk8Dk6wb%2Bgb2tGRWz0AzA%2FlqDU50S1gwpuckS1DZpbO1BnkusNSjBcNatO31GUXckJ%2Bm8EdYytGDcS1%2Fm4%2B0TqTmBhhSWmmpRgu261FxYhFH56DbkNYp18SpTR5akTveUowObOuSRk%2Flv0daVKSnazvQbvSvc59%2ByEWDZTzrfDA%2B17mpTchP%2F%2FsmWLrRg49mHPR5xUJSIbfllmp84OQR81dTkJcWRo22NOMDX4NwpOVdNQP5iHZLMX5wNgbVzLUgueilmconDSoBp1q1oNnaVEMOf6AxllZ1wfEEtMtiSR3ErucdsywdPxDASLQGpepCmnjFUjZjW9sdGILQGr5b0LcoFR1JnBso6i2FZEBAmrG5Dr2FtHQtkZ1JXNsomi3sZEKAmojVaD0bLUWnvXvnC%2BLQ8rlwq019QsyTCfgnF75fFAe6wEJLNsQ7gmBfRvpGgXeIY3sqOo8g9T0BrSzda7F7h1g%2BR8k%2BbQnwXPQo8vpKQleIRWgNdjI%2Fc6LAkBZjatQ9pKCTAvHo1QS9o1L1d5t7hGA0I623mHSKrkWxfLegrxCXRtorLezqgMOrkV6GWWZ6FenVpnfRR0iz0ImeeSY%2BTYi%2BwGbV3mMuglNN2V%2BPtBI1VQ%2BKCFcj%2FVbKFkvHHwSiTyhNQ1%2BjRHek4gPdPt7Ez%2BpOR50JBURgU5C%2BnZKoWzLFg75Et%2FKzqt9uCA0B6tTWtNVryPf3Wv5CegmyFfmfRQkLwQ9GevVqFdqLYr3LwL7m635DukyahQZbKOmHZPQJEF3S6OJZlzS6z9SDmYr%2BbtLsOPoT%2FYD0DzQHjefQQHNZ25Covm6mty0vJHF9x%2B8BtJDfeteurDi%2BAN3LtiYcRiO90JO%2BUzMnJycnJycnJ63U1f0Pn1ZeoSwSgjAAAAAASUVORK5CYII%3D)](https://twitter.com/nukebuildnet) +[](https://nuke.build) -- TODO +Founded in April 2017, NUKE is a free, open-source build automation system for C#/.NET that runs cross-platform on .NET Core, .NET Framework, and Mono. While builds are bootstrapped with conventional Bash or PowerShell scripts, their actual implementation resides in simple [C# console applications](http://www.nuke.build/docs/authoring-builds/fundamentals.html). This approach unleashes the power of the type system and natively provides IDE features like code-completion, refactorings, and debugging. A custom [global tool](http://www.nuke.build/docs/running-builds/global-tool.html) and several [IDE extensions](http://www.nuke.build/docs/running-builds/from-ides.html) further improve how build projects are setup, authored and executed. -## Contributing - - - - - - - - - -If you want to contribute, please first get personal with us about your intentions [on Slack](https://slofile.com/slack/nukebuildnet). This largely increases the chances for pull-requests getting accepted and helps us establishing a clean and meaningful design of new features. At the same time it reduces the chances of duplicated work. - -## License - -[![License](https://img.shields.io/github/license/nuke-build/nuke.svg?style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY%2Fl8WUAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTCtCgrAAAADB0lEQVR4XtWagXETMRREUwIlUAIlUAodQAl0AJ1AB9BB6AA6gA6MduKbkX%2BevKecNk525jHO3l%2Fp686xlJC70%2Bl0C942vjV%2Bn9FreVQbBc0wWujfRpW8Z78JaIb53hhJ1ygTA80w9PQ36duBMjHQHPCuoQZfutSjeqU1PAJN4E3j2pN7aVKv6pnWcgGawNfGa5N6prVcgGZBn8yvVXZXQbOgPXokXaPMNZwoc41D%2FaHZ8b7hpBrKjnCizIjD%2FaHZ8aPR6%2BeZXqqh7Agnyow43B%2BaZz40qnQ36a6rlsYgnChDLOkPzTN1z%2B9PafU0N3OAcaIMsaQ%2FNBufG1X9JyrtDMr0Y4xwokxlWX%2BPjAYdemhPrWeDvYcPJ8r0LO3v4oszNfivQQuTp2u9qJGKE2V6lvZ38UVj9q3t3oqEE2U2lvfXF4t6qPjTqDUV1fRyhw8nymws768vfOr2NtqOqFY4UUZE%2BusL6VDRX7%2FGzOHDiTIi0t9WMPsUKzNPx4kysf62gmuHir3sPXw4USbWny485ZOc2PsJ7VTro%2F3pwp5DxV7qHq2xa41TrY%2F2J7PfJkaHir3UwwdtU061PtqfTP0CUaYm2v3LxCtoDI2lMWk8p1of7Y8K0jhRJgaaYZwoE0P%2FpFUndZqtP6T4BE2zC5qtP6T4BE2zC5qtPyRN8OvhZUQae3ZBtT7anyb49PA6Ivp5wKnWR%2FvbJkncZXr6wokysf62CXRCWjmJxhqd2JwoE%2BuvTqS37JGJlB39GLzhRJmN5f31gz8XTpSJgWYYJ8rEQDOME2VioBnGiTIx0AzjRJkYaIZxokwMNMM4USYGmmGcKBMDzTBOlImBZhgnysRAM4wTZWKgGcaJMjHQDONEmRhohnGiTAw0wzhRJgaaYZwoEwPNME6UiYFmGCfKxEAzjBNlYqAZxokyMdAMoL%2FO%2BNi4bzjpT1e%2BNFb8V7gFzUXMLHqk%2BM1A8wArFj1S5GagOUly0SMtuxloTnJrUU%2B7QXOSW4t62g2ak9xa1NNu0Jzk1qKednK6%2Bw9roIB8keT%2F3QAAAABJRU5ErkJggg%3D%3D)](https://github.com/_ORGANIZATION_/_ADDON_NAME_/blob/master/LICENSE) - -Copyright © _AUTHORS_. - -This project is provided as-is under the MIT license. For more information see the [LICENSE file](https://github.com/_ORGANIZATION_/_ADDON_NAME_/blob/master/LICENSE). - -[![Built with Nuke](http://nuke.build/squared)](https://nuke.build) +For more information, visit the [official website](https://nuke.build) or the [main repository](https://github.com/nuke-build/nuke). \ No newline at end of file From fde8ef68c4461832519dac24ce58fbc0ceac7a95 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Fri, 4 Jan 2019 17:36:35 +0100 Subject: [PATCH 15/53] Update README.md --- README.md | 52 ++++++---------------------------------------------- 1 file changed, 6 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 9fd2cd1fc..7c2bd4c2a 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,11 @@ - +# About This Project -[![Release](https://img.shields.io/nuget/v/Nuke.Common.svg?label=release&colorB=0A7BBB&style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABfWlDQ1BJQ0MgUHJvZmlsZQAAKM%2BlkLFLw0AYxV9bi1IrBRVxcMhQHKQFqYuj1qEgpZRawapLkyatkLQhSRFxdHDt0EXFxSr%2BB7qJ%2F4AgCOokiM4OCiJIie%2BaQkF0EL9w9%2F14d%2B9y9wB%2FQ1cMu28aMKqOlUslpZXCqtT%2FCD%2FGMIwQgkXFNuez2TR%2Brfdb%2BES%2FiYuz8LcaLKm2AvgGyLOKaTnkOXJm0zEFN8ijSqVYIh%2BTYxYvSL4Wuuzxs%2BCyxx%2BCrXxugW8Lk6WyxzHBssfiLZJSsQyyTo4ael3p3ke8JKxWl5fYJzrDRg4pJCFBRh0b0OEgzl5lZj%2F7Eh1fBjV6FM4mtmDRUUaF3hjVOk9V2TXqKj%2BdO1gi%2B%2B%2BZ2tpMwvtDeBEIPrnu2xTQfwC0d13388h12y0gcA9cNnv%2BWpNxvlBv9LToIRDZAc4uepp8Apwz4%2FEHs2gVO1KAw69pwOspMFQARph1aO2%2F617e3XW07oD8NpC%2BAvb2gUnuj6x%2FAbvNdIz349ECAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAAGXRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjEwrQoKwAAABeBJREFUaEPdmV1oHFUUx5ukTWo%2FYkuVmtaXFqVoK8UHwVo%2FEBURlFJ88U3FUmmriCgiiFSkiuKDggo%2B6ENRqraCWvwA7Ye0IMVGTHHbajQEI2matrKb3Wzm487M%2Bjszxy2bbpKZ3dnu1j8Mc%2BfOuf9zzr3nnrn3zqz%2FLQ4ePDi7VCp16OOlB4xf7Dj%2Bq8Z4fcaYXx3ff5O6q%2FT1pYGsZa3wff%2BI7wc%2BxocIgoAq%2Fxj3FSrW2sDmTuP7b2OwiVw4D%2Bo8rh0U56p466JQCJbS84ci0y%2BE5%2FkHxsfHe1S8dUGPL%2BM6onZfAI%2BQKxaLV6t46wJbF%2BDIp1xBZPp5SB1ht5Pi5Sre2rBtcx%2FhNRSZfx7UDZPB7qbYpqKtjd7e3jl0%2FjrHdb%2FDeDKvz0D4h3HiHpyYo2KXBqTXM5lM5%2Bjo6ALKcnUmHQnk5WM6j07pzufzVxaDYDnlpNeysbGxJdwXDg0NXQbfxfs4o2yRjB7KdzCSB8h0IzKq1CcGHGRKT6JiwHXdva7nPcX9Jl417hMA%2BWzm10aUf4Pis2JE2oCTxOkPGuPvorxWVacHdHTSc8%2Bi5AwK0vdgElDhc51gdG7hMZ3kA9Ecx%2FEew4liqOUigrAdyE%2B4t1KszxkhoFeebIYT%2F0FCDRvWq0m1gUl9J0SnlDMEz77rep87jvMww%2F%2BA7YYh1yvhoCKpg7A%2Bms%2BXrlCzkmFwsDTXcb09GFmeE5TPFW17A0Z38djO1SZ7Gp5lDfcR95qy10yAewLuTWpaMkgahGBQucpOUGxXkQpQP08cD4UbAPR%2FgTNLVF080K7dstwtNPYimpBoJ0TdKlIV4%2BNBDxM0p01SBXn5FOF8o6qKh%2F7%2B%2Fi7XmPeVQ9Ih3yrvGYozZg8Ufh%2B1ShfY4NvGPEixakRUxTBhwgjsiyhCEgdHntDX02LCchsWXtjwPLf460EMn288ry9qHvUGeJnibBWpCt63EVrHwkYNAF%2F8t%2Fr7gy5VNzPOng0WYtCf2j4EIXOIheG0m66CMXdJGGqT1AH3e1zxHUF4ISNQ4QhrBo%2BJ8jTFqivUQpSCT0bSjUEqjggkvnDoDbLHavlAIdfN1WMZcy%2Fx%2BzPlhq7DoE%2FHEYEYC%2F4m1Pbj1F48%2B5HqhqTcyUBveo40Ey3jCJxydpYlkfxGKH7NqO4lO2aoP0e9pWJToiUcET7S5%2BvydeaxnMYpt43mctfg2DYc%2B4lwnXK91lRH4JLrS93CTrkn5127HQTXsl77DN1VV9JNdYRk8AujsIZirM1RLpdbjO4DUetKNM0ReCz2LluUNjbkRAb9I0pTRtMcgSPzFz2stLFB03bPC17AjohI0TRHLMd5TSkTw3WD25n8WaUK0TRHTBBsUMrEkHlFBvtDqUIkdoQ2C4zxjkfNa4cbBOuUMjHIYKsYkRNKFYLOfSepI7IfmfI%2FSlywNd6olImBwauxoWJE%2BA69xC3%2BfgThuRDtClvXAcsydcwR9zY%2BknmlCsGce4Rb%2FPNhESZtPoczda1mMeT4yMjIfKWNDZq227Yru8EyCLMxEsDNKhIfeqZ1RnlqAv0wIaeUFOPvs0HOslZODisc%2BaFYnH5jVxVy3M9Gan89QyIj6vlBX6HgrFHaGUGTbqKh4gCDOjn8eJHitFvtKWFZcuYbFCK62iDOGI9tcjFYzuOUI8O7ttOnTy%2FFYDkULB9DCbBhGJpVKpocmUypk0n3ASQVxLWApfswa%2Fittm1fl81mF1HVIaeUcj7A%2Bn2lbcwGZA6jq2LByHOBdc7jalLtkEUcZO%2Bm4QwcfCODk%2FT4t9w%2FZh5%2BQvkrWVgyByZUrAzeZenIbRTT%2BZMlv9Zs1%2F1QDIlUNB44kSfMNg%2Bm%2FfdKQsAx%2FisoGMGhhh35wG8xOgMsUR7avXt34%2F4p%2FlMo3CAZBIX7CIkh7nWNEp0SGs%2F9d%2BbInqLlbpUzZFXXWKC%2Fgyy0jF5biwF3MFE34twm6jcnuRzPe5TJfz9rsvXwXJ8rlRZTX9%2FfqXqwfft2%2BVfSUeOV0PBZs%2F4F1CRqhBU78vgAAAAASUVORK5CYII%3D)](https://www.nuget.org/packages/Nuke.Common/) -[![Changelog](https://img.shields.io/github/release-date/nuke-build/azure.svg?label=changelog&colorB=brightgreen&style=flat-square&logo=%20data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAWdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjFM78X%2FAAACVklEQVR4Xu3b4W0aQRRFYUpICS7FHcSd2R3FHTgd2CWkA%2FKe9%2FBkLRxg%2FuyyT%2FtJI6HZO5q5EMhiicPSjsfjU4zXGB8xTvJxzj0R6ykKvmXbG16J9xLF%2Fk797vLBsh6i0D2v%2FNwby7ctiuR7fu4rxkuMvJYjH%2Bfc3PY%2FE6LE%2FNXPor%2B4XHKOaz9t%2F19BlJi%2F91%2B4dCavTZGy%2Fc8Civx09uqfxLWztwuXlhN7Psf4%2FN79AmKF6RFDT8AtLC1MX5Kdnok5gopYYXrEyFvgJpYWps0nMUdQEStMj8gn2D4Erz75l7C8MK2IOXKKWGF6VBb9HeP032A%2BHi6fOEZhWhFz5BSxwvRqOEZhWhFz5BSxwvRqOEZhWhFz5BSxwvRqOEZhWhFz5BSxwvRqOEZhWhFz5BSxh8UxFTFHThF7WBxTEXPkrtE7ubXF2W7eSRJ15K75E%2BPhvqbmmTjbVcQdubao6ci1RU1Hri1qOnJtUdORa4uajlxb1HTk2qKmI9cWNR25tqjpyLVFTUeuLWo6cm1R05Eb8R5j8S9HuSd7D2G5IzditW%2BGufd0hPux1JEbsdrfB2Lvh3gCVvn7QO7J3kNY7si1RU1Hri1qOnJtUdORa4uajtyI%2FT6ApYvLvacj3I%2BljtyI%2FT4gxn4fsBXUdOTaoqYj1xY1Hbm2qOnIjdjvA1i6uNx7OsL9WOrIjdjvA2Ls9wFbQU1Hri1qOnJtUdORa4uajlxb1HTk2qKmI9cWNR25tqjpyLVFTUeuLWq6yPyboi19UdNFKH82d%2BlnrFuXnWY%2Fmzsc%2FgNQR%2FecCVfS%2FwAAAABJRU5ErkJggg%3D%3D)](https://github.com/nuke-build/nuke/blob/develop/CHANGELOG.md#changelog) -[![Bug Reports](https://img.shields.io/github/issues/nuke-build/nuke/bug%20:beetle:.svg?label=bug%20reports&colorB=DFB317&style=flat-square&logo=%20data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAWdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjFM78X%2FAAADc0lEQVR4Xu2bi1HjMBCGUwIlUAIlUAIdQAdHCZRAB1ACHUAH0MHRAXQQvt9aOR6HxHraIs43oznifVmWdm3Lus2cbLfbS9o%2F2ivtnebR3zom2aWpL4NOgHZrP4tgPp9ooUi36IXA3%2B1Rnwgfaf9pnisTZYGfO9pX5zEO2dyYmyzwc9V5dKiPjybawcGXTrzj3kTJ4EOdz%2BXO3CWDj3vnqufFRDs4OK0UAfYlOu%2FJmgnYTw8uB4fTRHyZKBpslfMp0%2F4Q8pVcE8x%2ByO%2FpjeDbyXuS6gB2z868KM%2FmPgrsxgP7baJ9EGbXAWw0%2BrWIngXYhKc2wuw6gM3YR0lSBiR8UBFm1wFs3pxpFVIGJCz%2FPShk1QH0h094pXm3MEGgH57%2FHpSy6oDZVMPCBIF6fEqjlFUHzKYaFiYI1OMHE6WsOoD%2BpzOrwqeFCQL9uPz3oJhcB9AdX%2FWSBM9GdOPz34Nych1A98GZVOHBwkyCbnoqo1zzXr4U4cUc5fH0OQXiHusxGNeBv0x4%2FnswqlnM5ib6CTIYnGstbyle7TSWgRNooVhGPakWg8ClFz1SyVosSYagWkRtheDngyIQ8ILWwuh7dC4Xdnr1IViLD0rz1QKC1XznT%2BXNTq8uBNL0b5X6aUCQkuv9pcn%2BiDIJQWq%2B7eVS%2F25AkJqLnrnUrwMEabEAeqIWTTvMcLWcL4D9u1rOFyAWbD6caZN82GnWgyCrvw229Bo8Zn%2FvT2kIcuNiNUmRTVVHIUjNDRC5zLMmQKAWC2H9AughWIsLIvXfBD0E05pASx9OdC5lpz8O1%2F1hBKOWFj1zidvrhMG6P46ivPrP48EbJJAtVRC1Fedg4UM2HsSoDRLj%2FD86fSSnzXkRFCvknIaE1QEUk%2FbWoDfXRZjsvMd0h0zboZQ8ddDVRai6S4wWXMzQjd%2FrhFLyBimBvmpCjWcI%2BYx62EE%2FfjBRisr%2FQ2B3TSsxG%2BTj2txGgV1cHUAhKf%2BPgQ99SUpZRJFNif8uE14HEKbfOibAl16jdTG0oKLODWeH%2FtYxyaRT7LkeX%2BEpjTAr%2F1tEfXBd6Tk8qAiL5H9LqA%2BuKz2%2F1wEExfO%2FFdQX16We%2FYHlYLX8Xxr1xXWpZz%2B1OXhy%2Be9RX1yXevYHl4OqwMPK%2FOfz36O%2BuC51qI%2BHl88Rdrcr%2B3kyqE%2Fqm%2F0849hsfgB%2BO7VepkdkzgAAAABJRU5ErkJggg%3D%3D)](https://github.com/nuke-build/nuke/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22bug+%3Abeetle%3A%22) - - - +This project contains ... -- Cross-platform build automation in pure C# -- Extensive wizard for setup of initial build implementation -- Bootstrapping for .NET Core and .NET Framework/Mono -- CLT wrappers for over 30+ of the most popular .NET tools -- Extensions for [ReSharper](https://resharper-plugins.jetbrains.com/packages/ReSharper.Nuke/), [Rider](https://plugins.jetbrains.com/plugin/10803-nuke-support) and [VS Code](https://marketplace.visualstudio.com/items?itemName=nuke.support) for improved build experience +# About NUKE -## :mortar_board: Getting Started +[](https://nuke.build) -[![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg?style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAGoAAABsCAYAAACCeCeKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa%2F1AAAEQ0lEQVR4Xu2OAWrkQBAD7%2F%2FPywvyk9ztQUx7VrHV0thWYAqKgLZ64j9fX1%2FLXyAcl3nCcZknHJd5wnGZJxyXecJxmSccl3nCcZknHJd5wnGZJxyLM7nqXYX6Lb9COBZnctW7LvW7YoXj4CyueHM29RujhCNwBrPfu5L6rRHC8UCHWe%2FcSf3mR4XjiSoz3niC%2Bt2PCUfSLs5tAvX7bxeODTuodyP1nSOvAP2fW4Rjww4z7mbogt68XDg2ZXFvrlDl7a2Pj49%2Ff973WcKxKUv3pvZXq3D0DvrNEo5NWbo3tb9DhaN30G%2BycBRkcPo77XJ0P%2F4mC0dBBqe%2F2y5H9%2BNvknAUZHD6J%2Bxwdjv%2B3haOggxO%2F5Qdzm7H31vCUZDB6Z%2BUhbkbG1o4CjI4%2FdOyMHdjQwlHQQanf9oOzF1tKOEoyOD0CbKwd2N3KBwFGZw%2BRYbOzdj%2BKBwFGZw%2BRRb2pnaHwlGQwemTZOj0tf1ROAoyOH2SDJ2bsYXCUZDB6dNk6PS1hcJRkMHp02To9LWFwlGQwenTZHD6N%2BEoyOD0iZ7h9jvhKMjg9IkydPravglHQQanT5TB6XfCUZDB6RNlcPqdcBRkcPpEGZx%2BJxwFGZw%2BUQan3wlHQQanT5TB6XfCUZDB6RNl6dzUdiccBRmcPlGWzk1td8JRkMHpE2Xp3NR2JxwFGZw%2BUZbOTW13wlGQwekTZene1H4TjoIMTp8oS%2Fem9ptwFGRw%2BkRZuje134SjIIPTJ8rSvan9JhwFGZw%2BUZbuTe034SjI4PSJsnRvar8JR0EGp0%2BUpXtT%2B004CjI4faIs3Zvab8JRkMHpE2Xo3oz9JhwFGZw%2BUYbuzdhvwlGQwekTZXD6nXAUZHD6RBmcficcBRmcPlEGp98JR0EGp0%2BUwel3wlGQwekTZej0tX0TjoIMTp%2FoGW6%2FE46CDE6f6BlqC4WjIIPTp8nQ6WsLhaMgg9OneUanH1soHAUZnD5Jhs7N2ELhKMjg9EkysH3tDoWjIIPTp8jQuRnbH4WjIIPTp8jA3ozdoXAUZHD6BBnYm7E7FY6CDE6fIAN7M3anwlGQwemfloG9Q92pcBRkcPonZWHuxoYWjoIMTv%2BULMwtamjhKMjg9E%2FIwtyipiUcBRm6%2FYt6c6cszC1q2sJRkKHbv6g3d8mCbl9W0O%2BScBRk6PYv6s0dsqDblxX0uywcm7K4N1faAd2%2FrKDfLeHYlEW5eVHvZtsFvfHtC7RPEY5NWZSbb%2Bqtqwp667%2Bfn5%2F%2F%2FuDfZgnHhh3UuwTqtz8iHEm7OLdPUr%2F7MeFIqODeP0H95keF44EOs965g%2FqtEcIROIPZ711F%2Fc4Y4Tg4iyvenEX9tkjhWJzJVe861G%2BKFo5FBnTnehXof%2F0K4bjME47LPOG4zBOOyzzhuMwTjss84bjME47LPOG4zBOOyzzhuMwTjss84bjME47LPOG4zBOOyzS%2F%2FvwFjF3BUCE0pDMAAAAASUVORK5CYII%3D)](http://nuke.build) -[![Slack](https://img.shields.io/badge/slack-nukebuildnet-red.svg?style=flat-square&colorB=F5015F&logo=%20data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM%2FrhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAAD0ElEQVRYR8WYaYhNYRzGx5JlKKJM2eODZVJElqRRQrJElkyKxAeNMqQYW5IPZkpk%2FaBkLI1IkkiTQpTJiJQaEVlCJDGWJoMZv%2Fe8z1wd7zlzzrn36v7q6dzz%2Fz%2FP%2F32ne%2Bbcc29etmlubp6MbjQ1NX1At9FUtXIPmxmLGtlgCs5%2Fogmy5BY2UqV9%2BaB%2BTpbcwkZuak8%2BqH%2Fl0Em27MLwwWgpmh21CJ6D3o4CoDdTtuzB0C3ot9YwizxBA9R2oDdNVgd6R2TzoNQVLURlyrVRKx6ExhFyoH5JFgd6HVG9rD6ov%2BWQz3EeOoO%2B246F8%2BMaEw8C25X1Qb0R9ZDNgd5pWR3o%2BTb1L%2FSna0w0%2BMtszIVBy2RzoFcsW2LIVmhMNPhH25gLg87LloJyO%2BpFHCs9UxqQ36Fx0eBvQ%2BCVjfqh%2Fg115qXxjEd70RvbTQ%2Fyv9AILR8PAgeUd6B3Dj3XaUYwpx6FXjahEJqiGVmH2Q3oAipGXbRkMggWop%2BamTWYuY5DNy2TDIIDGbAB3fOm%2FQeYvVzLxYfQTFSDmjQnbRjxG4X%2BgfQuaNl4EDCby2hjJg%2B1aD3qR8n8h7%2BwXT%2FUvbuAlo8G821lE0O2Dm3i5SCNS0F9n3W50JsjWzT4P9tYclhoq8Y40Au9C9A7Kpvx9UZr0BV0GS1Sy0KhRrnEkL2rMQ60O9D%2FZJ1%2BqL9Dq3hpvh6knphaoLZeY7wNmmswyPQS7UZjUOBlYHKor0Y50DslayLIfUF%2Fr1NOZqDr6CHajybiSz2jcb7BRl3orZbNgd4S2dJhpMZEw0JDFHKgd1U2D847o%2Fm0znJs9RErDHLmnSnQyHgQqFPeB3XzjFiAZqGT6ItaacOMKi0bH0K7lHeg90MvM8LMQcdQ8s9nQoFfAzKFueYdqEYrUOjTeijMaEvQPPeF3ngzgbmFWio%2B5MxH1SiO5Ryz8twXBvNXatl4kBlK6L6NZwZzzH%2FjLbRTJQd6F7V0NPjbE3hso%2BmhTZkfjtaiPppr3pFn1uGHurkV5XsbiAKzuUGnDflDHPprnA96e6wrkLmytQ5DpiuQLuUa5UDP%2FDQXCOselq11MPZEDcoFQv8B8v3M1gL1RxrlQNtcPh%2Bt06FStmgYUop8D7Ccms%2FobWiIPNVqBTHUGxQAOXMJOFBfLEs8CExCFWgjGq5yCmolmh1EmWwO9LqTvWNtFs5PcEj241EUDO2LAr8mUK6RLRAs5q1egMyXsyKVsw%2FDa%2B2W%2FFBvkCW3sJHN2pMP6k9lyS1spBd6r32loFYiS%2B5hM8PQNWR%2B%2FHmNStXKAnl5fwAgRCOjsreHTAAAAABJRU5ErkJggg%3D%3D)](https://slofile.com/slack/nukebuildnet) -[![Twitter](https://img.shields.io/badge/twitter-%40nukebuildnet-blue.svg?style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY%2Fl8WUAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa%2F1AAAGlUlEQVR4Xu2ce4gVVRzHV9NdLXddUQzLUAoMLN2lh1FUmNgflYUPsAcFC0UJW1T0h%2BUDoowwEoMeUkRamQamCVmBaRpRRERGmPZPYBalpKVlYj52%2B3zv%2BXld995dZ%2B7O3DNzZz7w5cydOef3ODp7Zs6cmbqcnJycnJycnBzvdHZ2nt3R0XEJuhHNQDPRNPZfSzlOx61qzknolAHWYSvZPkB5grIE9h%2BnOIBWoKnoLDMRGtr2s830oiTQdDpmB2UoaCO2szndzAWCNo3oMdrpH6HnTqTScNtMJMR3HlqPOtQhfQETH6BRZroEqvRHY6mzCO1DJ9AUO1wKleup8CO6y3YlCuKahH5R8lGBvZ%2FRFeaiAL%2BHo9vRZnTUqqruZor%2BVq0UKtxhFY%2Bgu213IiCeG9A%2Fii9qsHuQ4nHKuUid9rc7cgr2HaFotXDKQ6WNrnqhwVF0jx3yCnFMRErSG%2Fh%2FysIpD3WGqdNcdQe%2Fj1G0WRUvEEMT2uki8gP%2B11L0fOoKKkwu1O4GjfWH80E2ezcQA%2Fjsh%2B%2FnCoF4Av8bUIOFVBhY%2BD0K3Wy7HOyY45qUwjF14iI2B1j1qoDPceiwi6K6WM5vowZ%2BDqS8CN2HNqFDaIaF6WDH065peTguVrM5xJrEDv6WOe%2FVB9%2BfoHY2V1DuQl1H48UW4inYucSO9wr1tqGLrVls4KMRd7p7SBTE9R5F6ZnIgcWuypmhrob5NhTbbQ0%2BZhacJQhi2kIxyEI8HQ7Od9WCQX2xjs2xZiJSsP2S85QMiOcLiqEWXilUuNNVDQftDqIn2OzZeAVgc5Pz4B%2FFgpostPJQr5VKFd9f0vRXivtRJIMM9kJPFEQNMWgkfgMVL2N6hPoaqve7ppWDDd1bPsTmMDNdEdjQP4g38K%2FOe5jN4Ne%2FNHjdNY8Ezc%2B9iFrYDjXYUF8Xq78XrHgC%2F4fRSAspGDTQbEefp4m6InvwHZqHJrKr%2FCjWDepGOusSFvzrSiPcWUQD3ToVJxSiBts6LXSKv8PPNspLKZtRyQwx%2B75B3iC2%2FajRwgkOjS5DmrqJHfxoCl6n%2Bk70PnoWtSM9z%2FjM1fID%2FvdQBDpbSqDhkwUrGYYO1J%2BQyu79adyAPnSmsgn567lJ8MGPylNpVLxY5PdQtBVlEvriU%2BuKYNBgC9qDnkdXoSbsDKFcjSIdmdMAKb9pXRMMGqyytmqs0VKj0FdoOdpthzIDOS%2B0rgkGDXqdD8wgoZ4bqwNnW8PMQ18cQ%2BHmPGlwvhqajUxDP%2ByjCH8NSMP1zkS2oR82WpeEg4bXoMyNuN2hC%2BZZl4SHxh%2BbnSxzuXVHeOjAFvSfGcoc5K55yIqXv52ckXkGZfJUJu1XrCsqBztapbXGmcwO%2Bk8Dk6wb%2Bgb2tGRWz0AzA%2FlqDU50S1gwpuckS1DZpbO1BnkusNSjBcNatO31GUXckJ%2Bm8EdYytGDcS1%2Fm4%2B0TqTmBhhSWmmpRgu261FxYhFH56DbkNYp18SpTR5akTveUowObOuSRk%2Flv0daVKSnazvQbvSvc59%2ByEWDZTzrfDA%2B17mpTchP%2F%2FsmWLrRg49mHPR5xUJSIbfllmp84OQR81dTkJcWRo22NOMDX4NwpOVdNQP5iHZLMX5wNgbVzLUgueilmconDSoBp1q1oNnaVEMOf6AxllZ1wfEEtMtiSR3ErucdsywdPxDASLQGpepCmnjFUjZjW9sdGILQGr5b0LcoFR1JnBso6i2FZEBAmrG5Dr2FtHQtkZ1JXNsomi3sZEKAmojVaD0bLUWnvXvnC%2BLQ8rlwq019QsyTCfgnF75fFAe6wEJLNsQ7gmBfRvpGgXeIY3sqOo8g9T0BrSzda7F7h1g%2BR8k%2BbQnwXPQo8vpKQleIRWgNdjI%2Fc6LAkBZjatQ9pKCTAvHo1QS9o1L1d5t7hGA0I623mHSKrkWxfLegrxCXRtorLezqgMOrkV6GWWZ6FenVpnfRR0iz0ImeeSY%2BTYi%2BwGbV3mMuglNN2V%2BPtBI1VQ%2BKCFcj%2FVbKFkvHHwSiTyhNQ1%2BjRHek4gPdPt7Ez%2BpOR50JBURgU5C%2BnZKoWzLFg75Et%2FKzqt9uCA0B6tTWtNVryPf3Wv5CegmyFfmfRQkLwQ9GevVqFdqLYr3LwL7m635DukyahQZbKOmHZPQJEF3S6OJZlzS6z9SDmYr%2BbtLsOPoT%2FYD0DzQHjefQQHNZ25Covm6mty0vJHF9x%2B8BtJDfeteurDi%2BAN3LtiYcRiO90JO%2BUzMnJycnJycnJ63U1f0Pn1ZeoSwSgjAAAAAASUVORK5CYII%3D)](https://twitter.com/nukebuildnet) +Founded in April 2017, NUKE is a free, open-source build automation system for C#/.NET that runs cross-platform on .NET Core, .NET Framework, and Mono. While builds are bootstrapped with conventional Bash or PowerShell scripts, their actual implementation resides in simple [C# console applications](http://www.nuke.build/docs/authoring-builds/fundamentals.html). This approach unleashes the power of the type system and natively provides IDE features like code-completion, refactorings, and debugging. A custom [global tool](http://www.nuke.build/docs/running-builds/global-tool.html) and several [IDE extensions](http://www.nuke.build/docs/running-builds/from-ides.html) further improve how build projects are setup, authored and executed. -1. Install the global tool via `dotnet tool install -g Nuke.GlobalTool` -2. Invoke `nuke :setup` in a project of your choice -3. Follow the wizard to setup a build -4. Invoke `nuke` to execute the build (invokes build.sh or build.ps1) - - -On our website there is a complete [getting started](https://www.nuke.build/docs/getting-started/philosophy.html) guide that explains all the basics of this project. - -## Contributing - -[![Contributors](https://img.shields.io/github/contributors/nuke-build/nuke.svg?style=flat-square&label=contributors&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAFgAAABACAYAAACeELDCAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY%2Fl8WUAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAAEFUlEQVR4Xu2bjY3UMBCFrwRKoAQ6gA6gA64D6AA6gA6gA%2BgAOoAOjg6gg2XeSl7lfN%2FGdjweR9E%2B6ZNO7%2BIZjzc%2Fjr17dzqdtvLc%2BGD8MJL0tzz9j9rsmSH1oFnBO6MkHUNt98iwetAs8MWolY6lGHtiaD1ortDSmaTPBsXaA8PrQfMKb4ytUluKOZOQetC8woOxVWpLMWcSUg%2BawL3RK8Wg2DMIqwdN4JfRK8Wg2DMIqwfNjBeGlxSLcqzx1vhm5PNTefoftVkjtB40M94bXlIsykFogv%2FXKEnH6FiKQYTWg2bGV8NLikU5luis2HIJq03NFRJaD5oZPw0vKRblSHhcvqVBjqynaoBrLtNaKRblEBoYj1yKsTbIUfWcQTPDW5RDiynehV9boPEW5biAZoa3KIdmBN5STMrlLcpxAc0Mb%2BXxe15ZS6JXWm%2Fl8R%2BBZsboh0LPK2tJ9Eq7u4fcyGnNK2O0lGOZc3fTtI%2BGl%2FKJ%2BXdjtJRjmXNkPU9AM8NjbpqUP9mjtMw5sp4noAn8MXr121jGjLg9JOW3iRH1IGgCI5b3PC%2FVkpRrmXt3y5Wi51NX2zye59O8JHrae9eDoHkF7y2W2QPsXQ%2BC5gra8GvVtU1Cz1fjkq5t8XjWg6BZoGUeuTZPjBb1QXjVg6BZQc2idWmOGC3qQ8KjHgTNSjQHpJmAvOL80IjUP4P6sKS3HgTNjGfGS0PbMp8M7YeJtV0H3fPScWq3x4ecplnqW%2Brn2pqIak3HaQzUTmOiscnjPgJN47Whb714LcRQgbMH2Cu%2FxkhjpTHLczwaYH0a%2BmRGPN1p5Z8ux1FSrjz%2FqDo1hpczOyXTJTx62pRfTj3z0Fbltyj1ZaQ0luecSubx2lij6CKXmvXh3iuZ1322JJqgz1iuFC1z3x49KFmU9EHmhUZcPbQoE3VSnZNFKl82FB5Lh9dEizKRy6TnhJGiV82RZzGdvVG3h7OUMFr0VjRiTkxzX%2BUOlZJGi85iPeX1OuslxcpnDiL07JWUdIboq03yPAZZMSh%2B6L03Ke%2FEbDQ%2F7RlktaUH6TTQnIzOPm0otkpt6MydCpo7QPdPrR%2FUnM06RsfSPXc6aO4IDVpJuxzYBJqBaNqkdVX9TFWrUFr2S%2BuuomYBSscs2yiGYimmYk%2B9baA5iDSQGoAtPxHolXIqdxp46qM7aDqhs1PF6Hu6o5dCt0h9Ut%2FUx81bQiXQ7EQr%2ByO%2BUD1a6jPuSvSA5kY0%2F5xx6XtLNbjNpdHcgO5tR5NqolqbQLORyL21aNFeXhNoNhK2eD1BtEnQBJqNHF1UczVoNnJ0Uc3VoNnI0UU1V4NmI0cX1VwNmo0cXVRzNWg2cnRRzdWg2cjRRTVXg2YjRxfVXA2aN%2FxA84YfaN7wA80bXpzu%2FgPmTK3HK79ikgAAAABJRU5ErkJggg%3D%3D)](https://github.com/nuke-build/nuke/graphs/contributors) -[![TeamCity Build](https://img.shields.io/teamcity/codebetter/matkoch_Nuke_Default.svg?label=teamcity&style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEEAAAA%2FCAYAAAC%2F36X0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTCtCgrAAAAC%2B0lEQVR4Xu2aDZHCMBSETwISkIAEJCABCUjAARKQgAQkIAEJSMhl75KbtOzLC%2FDyhpuwMx%2B0e7RNtvmj3FcIYXio%2BR9YrVZhvV7%2Fgf35Z1r5ednv98EbFLwsSI3FYhG22204Ho%2Fher1GS9btdgvn8znsdruwXC5h0XOW5A13IYioSWHmoBKo%2BCtCIFrgecNdtRBw5w%2BHQ9y0E8KQWkbecJcUAvr25XKJm%2FZCV0G3ippcM2%2B4i4WAAFDQ3kqt7O%2B6ecNd8xC8AoBwnbJrvEUIKJBXANBms8FbrvtvCBg0WtD6KirCjmOUfRP7rcI10JxRkXKdkKdQLczamNBEmmpEpcrQYyVSoVShcrUZJYOZBZ9jYczHgsydUaNHCNriB0KFHl0RIoyyhaX1Bv0sNSWsQ2hpBc8EUIK7n7ox%2FTugpoR1COWdkpSuSY%2B3gpoSliGguWqqNWFLqClhGUKapqp6pRs8AjUlLENII70orR9bQk0JyxC08UCaznpATQnPEPA8IIoeaw01JTxDSNeix1pDTYlPCBHPEFqWyFZQU8IzBK81AqCmhGUI2hSZvlPQY62hpoRlCC2LJa9xgZoSliG0LJsfOd8rUFPCMgRwOp3iW13sIcijaC2KmhLWIfT%2BKo3WloOuhUlNCesQQOtDFe1uzkFw88eBUhB3Ro0eIbQMkFmYNrWf1rRfrVgQkx2NHiGAlrGhFK6DKRYVQpnwPQP7rT%2FazIOYFEajVwjou60VsFLZve4KVKNXCAB9mD0h7qH5anRSEI2eIQAE0TJQviK2HJ%2FsaPQOAcwflVsJrextZwcJFNiqe6BctVmFmhKeIQC0CoTx7KCJWSeVmZ4%2FQ00JFAonlej5dBh3ElMh%2BjTCLscOtBh4AFMl1h4oaxQ91xxqjgY1R4Oao0HN0aDmaFBzNKg5GtQcDWqOBjVHg5qjQc3RoOZoUHM0qDka1BwNao7Gzwt7StQb7ZckT%2FKGuzz%2FHUcjb7jrE0LUJ4SoTwhRbxcCG717846zw8CEr2%2Fmetn3QDyWVAAAAABJRU5ErkJggg%3D%3D)](https://teamcity.jetbrains.com/viewLog.html?buildTypeId=matkoch_Nuke_Default&buildId=lastFinished) -[![Bitrise Build](https://img.shields.io/bitrise/ffbfd67a7e3f1561/develop.svg?token=AsgY8yIy6MzdWs0cncU2Jg&style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAYAAABxLuKEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa%2F1AAAD1ElEQVR4Xu2bO2gUURSG88bGQhSVBCFEUVHSaKGCBBuFgI02IiIIgoU2ki6NWohikYBCEAuxkBBUSBfEFCI%2BQBFLRRDSiBhfQTAkanT1O%2FeeHXY3e2CX3Sgzez74mXse987cfyez7iY2%2FQ9yudzbPxVC7wudln3cGAM3xqDUGOIZyalmNB0gbug7ZpWWmhh3x1Sk0Y1p1ZIYsyKmIm6MwtiNKeAYuV2qfZoLNLoxJm6MgRtj0GjGXGXPt0WMHwYHCiB3n0O%2BfkmnNR5s%2FldwBBjPaNpxYwzcGAM3xsCNMUiVMVzgNnT9HymnvogxPwryS61e3W7lMOmAXmtmYY%2F9ut3KcWMM3BiDUmOI59EZNJZSDaNXup0AcV2M%2BcChTcuphD2MxN1E3BjFjTFwYwzcGAM3xsCNMajJGPrb0R4m3QuzlYwaM4H6GDZrS3lo2oGm47RiyGfOmDzk76IubSuGwnH0W3sXQS2zxgjUZtEhbY2QOIySj%2F7loJxpYwTqC2hLvrkLvdNaArkpHQaIM2%2BMQM%2Bb0Mz4RExFKMgXRftR1e9K1Jvp60QHRcTyC%2FoWLS8JrN%2FBufbq%2BXpQ8gcCpdBT%2BvDtR2MaJpA7Ks2TGgeIB3WRqoyRGjpHX%2FKckjG6zHCtttUN1mxh7dPoWzgZ6PmeoE3aVgT5RcZwkBdTfsGXQDwqJ0ggIXfLOl2kYmPIy6t2IzSWgdprDh3aXjOsJaacRWWfi6Sn0UZtTyC3yBjJM9wdMxHyC6XGTIUVgHHFxlA7GbtCn5grb3%2BTqPBL7lPaXjMst5n1Cu%2FMp2gczWlKchMcin6MyVnGtDOejdlIzcaQk1fvWWgCxoMcWlArKnx%2BPdApNcM5BnRNOd9jtJyhXIc8a8JdxEH%2Brm%2B1TgkQlzWG4xr0XdOBUmPmUKc2V2PMCJJXbJx4mZZkjZX5PDqv6ZphrYGCdcP1CnotF%2FI14m4tBchZxuzUVIIkR3UcIL6jzVU9fNMAe7CMeampAPGoJJPbMg%2B5i6gRjDmChjUMEMtzcbvcfm0En0O2AHLzOgwQZ9GYnzpMIPdI28OEreS%2BxlJ5smhMKbrHHm2PkOxFyT%2BWSsm6MdQ%2BofXaWgz1Hoo3Y2sxWTZG88V3Sjlo3ICuxGmRLBpDPCR71XJlMKFh3q6rwo0xcGMMLGNQc1rFHq5xTKiXMfKpWT4xp1lF32kT125MFnFjDNwYg7oYQ%2FyRg%2Fx%2FxdSKPTznmFAvY95rKbWwhyHdTsCNUdwYAzfGwI0xcGMM3BgDN8ZgqYz5gvpSrlu6nQBx7cZkETfGwI0xcGMMbGOamv4CdueugEMtOgwAAAAASUVORK5CYII%3D)](https://www.bitrise.io/app/ffbfd67a7e3f1561#/builds) -[![TeamServices Build](https://img.shields.io/vso/build/matkoch/424e9b58-2f8e-4720-939d-94cca30d9998/1.svg?style=flat-square&label=team%20services&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEAAAABBCAYAAABhNaJ7AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADdYAAA3WAZBveZwAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAAGH0lEQVR4Xu2bW4xdUxzGp6VtqpqiU5SGhj4M0gsJbXQo4lYmtNELU6ZTvaEtohHEA0E8iEYaDySCSGjTIqEPbqElhBAafaESbURJaOoWtHqb8fv2%2FmYy09lz5uy19z7OGf0lX%2FbZ6%2F9f31rrPzPn7L3Onrpapq2tbSp6E81sb28f7Ob%2FDyz6UhRBEX5CD6FTHe7%2FsNgrvf5OaNuPXkdXcHqEU%2FsnLPKqeNnJEP8WrUQj3aV%2FwcKavNaSkLcHPY%2FO43SAu9c%2BLOjaeInlQb74Ai1Aw2xTu7AIvfsHQd%2Ff0Cpb1SYs4DqvJxhb1SbMf3a8jHBslR39TaHRPq0IjDfH6wjGVtlhMmegnajJTYXDWHO9jmBslR0mM0GGHMUqNMShwmCM66NVZMBW2WEyE%2B3Zwee0jXO4EPC%2FwWMFY6tw8BiIGtF6GXaFCf6B5jg1d%2FBu9lDB2Co99D2RCdyNvomtkiEunkZD3TU38JznYYKxVXmQP4hBp6NX0f7YojzI38KhwVa5gOeNsXs4tioNeacxmG41f4y7hUH%2FPz3pHtfjtB1FbAK6CelN9F3a6h1ORLnyzYKteoL5EDQXvYcOOj8T%2BIjtvJyBGnl9D3oRbUX%2FREldoO1sTycR4i1ODcZW3cF4ItrpnCDovw99jdYgvVdcgjpvS3m9yam9Qs4UpydCPP8CYHoc2uZ4WZD%2FN%2FoSPYeWo%2FNRyTc94uUUYKrTEyGebwE4H4jphjjUE2LiL%2FQpeoqmJWgSr1Nf9NCnnAJc4PREiM93ajC2isHwfrd38Dt6n%2FYnkN5wGtAgp2cCvz4LABc5PZFcC4DZZeiA21X9uzgUtntSjQVY57YIzlscKoQ8CkC8NU4Lx1aJBWh2qBCqrgC8PvRafrZDhVALBZjhUCFUfQGY4NUOFUIeBcBjgfOCsVViAS53qBCqrgCYvey2CM4vdqgQyikAOdOcnkihBYBGhwohpwLc7NRgbNWzAJxPdqgQaqEA5zhUCGUW4EKnJ0J8oVODsVVkpkvhF9AOBTiOd6gQ8K%2BuAnRAm%2B4Iz%2BJYz%2FFMjiPQkQ7nRtUWoCsMoM3Mg0hfJG5B2gt8HK1ATWg8Hkej1DdN9C2nAH3dDi9yajC2Sob4YAbZGKcmQ1z8jD5Da9GjaCnSn9Q4lPg1NO3VXwDBINoh2ur81NBXv0E%2FIO0tPoPuQ7PQZqf0Cjl9FWCxU4OxVWkYSD%2FJXe5TERhPhSv5SVSxAggGm4b2uV%2BhMI62z2d56F6paAEEA85Hbe5bCNhvQxM8ZElI155kJmxVPkzuEfeN4PwVpB3hzu20UPDQ%2B0TZT3TRpfIFoM8AJrk27h4xye1jadf%2Bvz4NUn2RQr5YzctU1xvkV74AgskORR%2FLgOPpbu6E5lNo1%2FN5n6CSxSC%2Bm0Oru6aCvktjl3BslR4GPx5tRye7KRHiJ6Hb0Ydor8eN4Px7FHzTRd%2F%2FrgCCCeixmOE%2B7RNydU2hZ%2FT0J6QNmJJffvYFPrdEq8iArWqTwwU4XIC2W72OYGQyBs1E%2BgibhybTXo%2Bq%2FlFz5rosWkUGbBWZDUfNaAPajX5Bm9FL6AGk2Lmoah49Zy7LvY5gbNUd2rUJ0soAb6A9UWYXaNuFPkLPcnovR93d6TG5Y2xRERhzRTShDNiqd8gZwUAL0Vuox2MsXSF%2BAOlp0Y1Imym6GLqGUAPHYRxz%2FbYZzzuigTNgq%2FJgQH2OL0LvoLRPie1FO5AKuRrpSRL9W8tYFPR%2BQ%2F87I%2FMM2Co9DD6K%2Fks46gYm020y%2FfUfHV%2Bh19BjaDHS7fcYwr0Wh%2FjK2CEcW2UDH22g3oY2odz2DPASKo7uNtehh1ELmoJ0KX7oEy2p8RLywxPTr%2FcHKNWfSRrw1o5RZn9PuxiY4GikHWQVI%2FN%2BQRF4qsXjYuhzWw9dVWRrrRTM4Vf0pKdXWRj4BNTxm1GxYjCW0G603rxzf3g7CCai9wxd0uo3o5D3DHz1RqpHcnWZX73%2FN8gE9ZuhTxNdSGUuBh564lVXqqM8RO3ApFWMZUgfrd12kkqhXKT7memcVu9POw0sZiTS121vo8TLcdq%2F4%2FAgx5JbdDUPizwW6UZNV436tmo9x8D%2FFK%2Br%2BxfkhJRKNRzLKgAAAABJRU5ErkJggg%3D%3D)](https://matkoch.visualstudio.com/Nuke/_build) -[![Travis CI Build](https://img.shields.io/travis/nuke-build/nuke.svg?style=flat-square&label=travis&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAAIqklEQVRoQ9WaC5DVUxzHy7aF8lahpCcy8oxRiBiPGT3HMzQTRZZi0ENNY0WK0BhUDHlUzFYatUkJFeURW6PaabQkqrXVPttX9%2B595PP97%2B%2Fevbf%2FPu69u5t8Z35z%2Fuf3Pud%2Fzvmfc%2B5t0tDwer0X%2Bv3%2BpwKBwAJoi98fyK2oqCiBiqlnQz9Dc9AZVlpaeqaZ%2FbfYt29fKxIaTWLbDh2GYDDoh1%2BK3MNzwNgOVAerfD7fAKpNzd2RA0GPIbFHSGK%2FEqIsgRbBe5Qe711SUtImNTX1GFN39PPy8tqT8PUkr7f0BaVHtpQbsbnOVBsfxOxIAuss%2BO%2FQiJycnJYmjhmYn4Lt0%2Fj6h1KvZHZ2dvbxJm4c0IN9iZUPldPb40gi2UQJQ8MQv9Px6Yc2lZWVtTdRwwLnA%2BglL%2BVOJuwlxg5Djdm%2Ff3%2BfWAjd8PAKAb834F%2Bd8zfUydgNAxz2gTwE2E4PtTN2FJC3IbGYsHDhwlZmFgVWp4vxk0ucHcyjtsauH3B4jpxC%2B%2FRsbBeQ1bsBAn6uhA7SCM2z%2Bg1RHCThaD0OA4zTG41dLSIbwLMa%2FLtVVc%2BEiq1aawME5leK9Ig9xViJAUejzdE7xqoRJHiakjZKg2bK1vAc9a9C8vT09FpXG%2FSborca8jHfehg7PhQVFZ1K4gVQEY5Oq%2BTGDmyiGmDsmOH1BjUfAtDXxooPGL6gyDRgsrFcKC4uPp2P0NXl5eVnGyuMuhpAB3XFdgxveQhlL%2FRbmygMeJ%2FKOO4PnT5MGGtJ87AynHHw4MHOzIF%2BBBtDg96j%2FJ4yD3kJzyPMLArI6nwDGh7YL8XXLvT1MdMbl%2B%2BZ8IchHy5j6p%2BbSd1AX9uEMTLEpxfjMnOi5W099AHyiTTodthnmJkLsTQgEuifSE9fi2%2FtreZSZqlRMqYeQNbTVKsHekp8OLrO6kG5GftpJNo%2F3t0jdhNwUSQ%2FAvV8iodNHDP45pylziKXPWoM%2BIaGXGPiaCBcomAob2LI3GzshICv1%2BQrEvDGmzhuYN6cxFPwoW9RkEaNMlEl4LUQn%2BQXo9zM2AkDXw3agBDw0Rb6izxXG6sSrCIdLMgTxqoXCgsLO%2Bbn5%2FeOJLbT1W5B4gU5fk4DfrNqJWB2UgN4NWONddSCXFdAf1i1EjqAqAG07JWsrKwWPLp2iyHs2rXrOC2rjMneOBpMo0dCk7B9lQk%2Fh1Jf4XTkqyhXU66Gp15bDM2FZkFTsHkSGorOLSyXF%2BmbQtwaT2eKqxLbjdBWhxmCTk8wS6EVOEnC4T0k8w71n6ANMoC0zQ3vZxoD%2BPcRZy%2B0ncZtof4jeXxHJ0xSp6HSDFk5tMxSrwLMtVAZhs9KAXKOi0cDyCUHWkpjXlddOVraVYDpfLz%2BD2CEXGppV0FjkFdWaDpHLXgTay1lN3hFOvP6TTcK8LEN7IG%2BhdKNJ%2BYC7G5SrzBOO8Fqm5ube8KaNWtase9P8ng83dD5xXECeOawElzJG0%2BB7oQew%2BZ5ny%2FwITIN491ya%2BphwFuA7gOULSzdaBDoPIR7TT8MHKYxiXpG3jzA%2Bwxaj%2FjyzMzM5sYOA35TGtOFgKmQ7obW4mM8dB2yY6WjePAfrO4mQiuOOoQYq5SDUFBQcJKJ3SBxfeF2SpHSQ4%2B%2B71gBnMw2NQcEvYtEdGJKRpZOvQIaamIlfyz8bMc4AvC2mIritaS%2BlVKbw3Rju4DfL822yFhuIE%2BWIymqpGe6qwdUF3CywlQdHDhwwDnc0EN6nYf4hvQI%2BAO7HSGg8beZqQvYXBbSIalt0EfiE%2FMCx%2FgwIN8hOeVmY7mBs2kkQqdWTEQ3%2FAGDl2PG24wVBeSzJA%2BButMw9N82lg4i4%2BXfqvLlbKvRHWIsB3qr4kdCQxN9Zz5SVn8eQHY5wt0Ecm1R4W%2BQMcFKjRUF5G9ILvCs%2B6KWPDbl2Rk%2BlHkUSRq7yLzG2yhbevxc%2BRWPUhcGb1FGncg0RyQXsHvJ2FWAr6%2FafMoOxooCsgWONWACtzG2A4ZRNxr9CBN1JDSc5yvEp%2BxpJgo611EGPDuTkSSDoeOnFgVWq7NguVYVVHUb4uxoKf1a3UxUBYJdifxkq7qA4ctyIBDkVYpq72jUc%2FRWf%2FRfhDZXWjg2d5hK%2BHZDQEfbEl3Bv0IOT9D7g9RwXWRpS0OyXZH9YOrSX2Ru4gNB7yEJ50hnyGAS9tBERPYojudB4bufSMD3sn0%2B0Vw1IamOJqoVsoOcW%2BsQKiqCid9c0zv9aYPro1ITCK6N2BIa6Dro42s6slXQb5Az%2FmtDSDcjI6N%2Bt3M4WUdCznV6JOBr56itrW4Q7qeXO5uJhqc%2BWOGTne5TacBktiut0btB80DLMW%2FzYvi67UjBz1RoPrSW%2BuM6ZPG80lwkjqA%2FOFoOoYdwuJQ3MoGgfQ%2F%2FTQD%2BrX5%2FYBl66rksKJ9nfah%2BRabjqm41fGo89QP4GGim1QLbZ9AbaVVN7Jq%2FxLVBmzwCb2VvU%2BNZmUDaz0TOlzohffzq8sx1eIKnVShTb4mG3o7qOt5qLxPXDRxofxI%2BHeFgNj0yzKpRIMAgJaOkEgGJfo3vsdC9JNkn6Al2pxwFfzsUuuJZYuFiAzYn4XA5NJTnZI1ZnGRpl2kq0kkm%2BZvJvUBBGgv49zNXLrSwsYPkBssBieso%2BTh1TbJ3adQQyk%2BgI3J2IE74gxg3SDrN%2FMhRnUtfQ4OYPlatLpZO%2FMCHJrCzqfsvQOw5lkri4C3cWp9JKpBI3BcEhPwTitqDJQwSmGp%2B4wZJ5DFvUq1aJ9AvJN5sStfvBQkDv7o3Cs%2BHWEESZaxgd2trrEMLPn41URiW8HKWznGQdrNJFrZhgWM1YjIBozZb1QGdElsAzjdzB9Sb0RDdO5VBO3gz98Gr8RawUUBy7Qis%2FzvMo1xO%2FWOSncGztsZvUmqz9gXP03keB42lPgNaAenjlBb0BfUnj8bp6YaAfiBkOFxFI%2FrRwIGUfRlK55B0A%2F0zpUmTfwETbFdHqdj8MQAAAABJRU5ErkJggg%3D%3D)](https://travis-ci.org/nuke-build/nuke) -[![Jenkins Build](https://img.shields.io/jenkins/s/https/jenkins.nuke.build/job/nuke-build/job/nuke/job/develop.svg?style=flat-square&label=jenkins&logo=%20data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM%2FrhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAAGBklEQVRYR82YfayWcxjHT%2B%2BnkuQlU2e9iE6MiJS%2FakOLFCvOJHGY1kRYRqNh2LAOUXZaTJFWMubloGYtm7Nl8tZ0hlUzJ0dFRVGhF53j8%2F093%2Ftxnufc9%2FNyTjbf7bvf77qu73Xd93M%2Fv%2Fv3cpe0BU1NTaWNjY0Xw2nwSbgMroK1cD38BK5BtxTeT380bSen%2FzfgAj250G1wLTyIHQtih%2BE%2BeMSuAOxf4bOwzCWPDajdjaKPwX2pS2UC%2Fx9wGd0K2v607Z3XHrsvvAJWwXrr%2F4T3Rbo2gSKnU%2BwbFc4G%2FqNwETzF8pwgRTc8Gf7g%2FDdhF4eLB8m9o2LZwL8fjre0KJCuobLKdd6gaedQcSB5pYpkA%2F9fcJRlrQJlOlFjtevNsrtwkNQfHlWBbOCfYVmbQKkTqPUjPAD72J0fiLvCFanbyYSLtRg3%2BE6DI5AMgR3sjgU61R8I9QJNcd35DucH4reVlATiYy3VUzgf%2B%2BNUJI0BDseC%2BPSULNTa43YvTaklyUCoCTUfKqSlHYL%2Bd3gEvgofgnNDoRxAUw4Xkb%2BU9rtQEdCfYEkyED1tfSyIC%2F2trUmZjRNDcitAyQ7kL3Tt%2FH8zonckTgLxWkulHQ%2FvsJkGPq02NchzTh9oytF8RHsD1OqzzqFkIArzUxKIT7U0EWietzY9FdHXSvIh7vTqgX0mPAS%2FhZvhboeSgWi5iseBmMZaD0sTgWak9cvtkq%2FavvPsCsCeZ%2F%2FfUCtT7pUF7SNKiAPJDZYlAllHtWg%2Fhwdh2BjQjnWNBbYrYR2slT8Cdm%2FFE4Gg%2BUvym9sAYodoeloaCzTacmm79bVzZspPV%2Buw%2Fkrd9NlwDvwF6qlp87DD%2BoGhUBwI3mTROpoL7XtYvgjYVwdxDAhrj7gGhq0Y7VY42GHVuhTqhrbAvvIh6wz1JmvaUc6gIM4GsY4Ed8Bt9I%2BTkLYdbZkSI2Df45REINM6exJti%2B0Ufm2zVKcepm%2BG%2Fkv2xy95BC6wYB7sAXWzsx3TAN4G70SSf7bPA%2BrMgoL2hyfb95Yc2N2CKBvEokGs5Bvdv9uxGZhtvrHmoOYcX6PKtsatNsTxcyfB6Ak%2BB%2B%2BFm%2BBQh1sNagyHGX8btjYJL%2Fh6mjM1lHQc2GhJSyDSuNkJd8ET7W4zqKXDlFaJ66H%2BHb3lh31zX0HtgsI4p13htHgg0BiTUHPYGfJh9qOvbX1YfwsF%2BuPdzlTNCNh6i7X7uZm2qzT0KxwLQyoRaPSo51usF%2BMz2GD7WsvyAu25cA%2FU8lYGr4R3wUnwVF9Hvu%2FhdXCxr1HYkEI4Dq4lJ0zU9KsdKgjoR8DNztUT2wh1QNL41s1vdUzr8O1wN9QbXdzZhKSwN6R9wq4A7NlQW%2FXYSRW%2FnpLG9FT4PtSKIWgVGQp%2FhkvQaD95Tdw1CgJ5nUncCzPeLuzJLvq4XWngewbqqU1DEtZl2nawFPZSPwiB%2Buj0BUKbkOQlLhdIjKaDc%2BySrwtsgDqflNsdgD0Y7nKOdtsb6H5Bq4m%2B3rIA7InWpXc9RYN8nTmExXYFYE9IucONXmR3AHYf%2BBTcADW%2B9Bdrv6e%2Fu7s1OjXqpg9wjZxnmJwg%2BTKKROeOYXYHYGuA621XbCEs6JsLukEweom0pOY%2Fi2SDJB1s3lORCNjb4XBLArBHwS2Oa0LWOaUScwDMeCvx66k9CvdL3xz43qXpZ2kyEOkwrYEeZvts4NfTehmOwexFq7kt6aOSvnBpydQ0E%2FZ7uYBG%2F1T8kYK4NpS3wp0peeEgR%2BvoXLgEbrc7AFs7lDQwV8ORUOeROrvTwCeM8W2lgGMYXG9NQUD%2FAc3r7q90Kf1Q7SunwC8Vi4D9E5xkWQD2AoezMd2SIHoAZnxoLATkaK6LlsXXXC4D%2BC%2BBL8Jq2OITHb6qUCwL%2BK8KAvqaiGM%2FEBUDasTeYD6Q94pLZAD%2FWZYE0af2txrUqHG5NHBrTI%2Bj1ecNfRYR9flXf%2F%2Fl%2BKfThu8yzYFP55l%2Fv2XjuCUVaj2osYlGN9QdjoZ6YcKGoFiQV%2BdbSwGfvj%2Fry1KbQA0te8diuLRc9nA%2BCLX3%2Bz%2BwMnVXJSX%2FACrjqI7wt59WAAAAAElFTkSuQmCC)](https://jenkins.nuke.build/blue/organizations/jenkins/nuke-build%2Fnuke/branches/) - - - -If you want to contribute, please first get personal with us about your intentions [on Slack](https://slofile.com/slack/nukebuildnet). This largely increases the chances for pull-requests getting accepted and helps us establishing a clean and meaningful design of new features. At the same time it reduces the chances of duplicated work. - -## License - -[![License](https://img.shields.io/github/license/nuke-build/nuke.svg?style=flat-square&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY%2Fl8WUAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTCtCgrAAAADB0lEQVR4XtWagXETMRREUwIlUAIlUAodQAl0AJ1AB9BB6AA6gA6MduKbkX%2BevKecNk525jHO3l%2Fp686xlJC70%2Bl0C942vjV%2Bn9FreVQbBc0wWujfRpW8Z78JaIb53hhJ1ygTA80w9PQ36duBMjHQHPCuoQZfutSjeqU1PAJN4E3j2pN7aVKv6pnWcgGawNfGa5N6prVcgGZBn8yvVXZXQbOgPXokXaPMNZwoc41D%2FaHZ8b7hpBrKjnCizIjD%2FaHZ8aPR6%2BeZXqqh7Agnyow43B%2BaZz40qnQ36a6rlsYgnChDLOkPzTN1z%2B9PafU0N3OAcaIMsaQ%2FNBufG1X9JyrtDMr0Y4xwokxlWX%2BPjAYdemhPrWeDvYcPJ8r0LO3v4oszNfivQQuTp2u9qJGKE2V6lvZ38UVj9q3t3oqEE2U2lvfXF4t6qPjTqDUV1fRyhw8nymws768vfOr2NtqOqFY4UUZE%2BusL6VDRX7%2FGzOHDiTIi0t9WMPsUKzNPx4kysf62gmuHir3sPXw4USbWny485ZOc2PsJ7VTro%2F3pwp5DxV7qHq2xa41TrY%2F2J7PfJkaHir3UwwdtU061PtqfTP0CUaYm2v3LxCtoDI2lMWk8p1of7Y8K0jhRJgaaYZwoE0P%2FpFUndZqtP6T4BE2zC5qtP6T4BE2zC5qtPyRN8OvhZUQae3ZBtT7anyb49PA6Ivp5wKnWR%2FvbJkncZXr6wokysf62CXRCWjmJxhqd2JwoE%2BuvTqS37JGJlB39GLzhRJmN5f31gz8XTpSJgWYYJ8rEQDOME2VioBnGiTIx0AzjRJkYaIZxokwMNMM4USYGmmGcKBMDzTBOlImBZhgnysRAM4wTZWKgGcaJMjHQDONEmRhohnGiTAw0wzhRJgaaYZwoEwPNME6UiYFmGCfKxEAzjBNlYqAZxokyMdAMoL%2FO%2BNi4bzjpT1e%2BNFb8V7gFzUXMLHqk%2BM1A8wArFj1S5GagOUly0SMtuxloTnJrUU%2B7QXOSW4t62g2ak9xa1NNu0Jzk1qKednK6%2Bw9roIB8keT%2F3QAAAABJRU5ErkJggg%3D%3D)](https://github.com/nuke-build/nuke/blob/master/LICENSE) - -Copyright 2018 Maintainers of NUKE. - -This project is provided as-is under the MIT license. For more information see the [LICENSE file](https://github.com/nuke-build/nuke/blob/master/LICENSE). - -[![Built with NUKE](http://nuke.build/squared)](https://nuke.build) +For more information, visit the [official website](https://nuke.build) or the [main repository](https://github.com/nuke-build/nuke). \ No newline at end of file From f9a5e937c7114c0f5b4bf908c0b4629b618b5a84 Mon Sep 17 00:00:00 2001 From: Matthias Koch Date: Sat, 5 Jan 2019 14:31:01 +0100 Subject: [PATCH 16/53] Add background to execution-plan.html --- source/Nuke.Common/Execution/execution-plan.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/Nuke.Common/Execution/execution-plan.html b/source/Nuke.Common/Execution/execution-plan.html index 614e7cc8a..28dc8db9b 100644 --- a/source/Nuke.Common/Execution/execution-plan.html +++ b/source/Nuke.Common/Execution/execution-plan.html @@ -38,6 +38,13 @@