private static void AppendMSBuildSwitchWithOptionalValueIfNotEmpty(this ProcessArgumentBuilder builder, string @switch, string value) { if (!string.IsNullOrWhiteSpace(value)) { builder.AppendMSBuildSwitch(@switch, value); return; } builder.AppendMSBuildSwitch(@switch); }
private static void AppendMSBuildSwitchWithOptionalValue <T>(this ProcessArgumentBuilder builder, string @switch, T value, Func <T, bool> predicate) { if (predicate(value)) { builder.AppendMSBuildSwitch(@switch, value.ToString()); return; } builder.AppendMSBuildSwitch(@switch); }
/// <summary> /// Adds MSBuild arguments. /// </summary> /// <param name="builder">Argument builder.</param> /// <param name="settings">MSBuild settings to add.</param> /// <param name="environment">The environment.</param> /// <exception cref="InvalidOperationException">Throws if 10 or more file loggers specified.</exception> public static void AppendMSBuildSettings(this ProcessArgumentBuilder builder, DotNetCoreMSBuildSettings settings, ICakeEnvironment environment) { // Got any targets? if (settings.Targets.Any()) { if (settings.Targets.All(string.IsNullOrWhiteSpace)) { throw new ArgumentException("Specify the name of the target", nameof(settings.Targets)); } builder.AppendMSBuildSwitch("target", string.Join(";", settings.Targets)); } // Got any properties? foreach (var property in settings.Properties) { if (property.Value == null || property.Value.All(string.IsNullOrWhiteSpace)) { throw new ArgumentException("A property must have at least one non-empty value", nameof(settings.Properties)); } foreach (var value in property.Value) { if (string.IsNullOrWhiteSpace(value)) { continue; } builder.AppendMSBuildSwitch("property", $"{property.Key}={value.EscapeMSBuildPropertySpecialCharacters()}"); } } // Set the maximum number of processors? if (settings.MaxCpuCount.HasValue) { builder.AppendMSBuildSwitchWithOptionalValue("maxcpucount", settings.MaxCpuCount.Value, maxCpuCount => maxCpuCount > 0); } // use different version of msbuild? if (settings.ToolVersion.HasValue) { builder.AppendMSBuildSwitch("toolsversion", GetToolVersionValue(settings.ToolVersion.Value)); } // configure console logger? if (!settings.DisableConsoleLogger && settings.ConsoleLoggerSettings != null) { var arguments = GetLoggerSettings(settings.ConsoleLoggerSettings); if (arguments.Any()) { builder.AppendMSBuildSwitch("consoleloggerparameters", arguments); } } // disable console logger? if (settings.DisableConsoleLogger) { builder.AppendMSBuildSwitch("noconsolelogger"); } // Got any file loggers? if (settings.FileLoggers.Any()) { if (settings.FileLoggers.Count >= 10) { throw new InvalidOperationException("Too Many FileLoggers"); } var arguments = settings .FileLoggers .Select((logger, index) => GetLoggerArgument(index, logger, environment)) .Where(arg => !string.IsNullOrEmpty(arg)); foreach (var argument in arguments) { builder.Append(argument); } } // Use binary logging? if (settings.BinaryLogger != null && settings.BinaryLogger.Enabled) { string binaryOptions = null; if (!string.IsNullOrEmpty(settings.BinaryLogger.FileName)) { binaryOptions = settings.BinaryLogger.FileName; } if (settings.BinaryLogger.Imports != MSBuildBinaryLoggerImports.Unspecified) { if (!string.IsNullOrEmpty(binaryOptions)) { binaryOptions += ";"; } binaryOptions = binaryOptions + "ProjectImports=" + settings.BinaryLogger.Imports; } builder.AppendMSBuildSwitchWithOptionalValueIfNotEmpty("binarylogger", binaryOptions); } // Got any distributed loggers? foreach (var distributedLogger in settings.DistributedLoggers) { builder.AppendMSBuildSwitch("distributedlogger", $"{GetLoggerValue(distributedLogger.CentralLogger)}*{GetLoggerValue(distributedLogger.ForwardingLogger)}"); } // use a file logger for each node? if (settings.DistributedFileLogger) { builder.AppendMSBuildSwitch("distributedfilelogger"); } // Got any loggers? foreach (var logger in settings.Loggers) { builder.AppendMSBuildSwitch("logger", GetLoggerValue(logger)); } var showWarningsAsError = settings.TreatAllWarningsAs == MSBuildTreatAllWarningsAs.Error || settings.WarningCodesAsError.Any(); var showWarningsAsMessages = settings.TreatAllWarningsAs == MSBuildTreatAllWarningsAs.Message || settings.WarningCodesAsMessage.Any(); // Treat all or some warnings as errors? if (showWarningsAsError) { builder.AppendMSBuildSwitchWithOptionalValueIfNotEmpty("warnaserror", GetWarningCodes(settings.TreatAllWarningsAs == MSBuildTreatAllWarningsAs.Error, settings.WarningCodesAsError)); } // Treat all or some warnings as messages? if (showWarningsAsMessages) { builder.AppendMSBuildSwitchWithOptionalValueIfNotEmpty("warnasmessage", GetWarningCodes(settings.TreatAllWarningsAs == MSBuildTreatAllWarningsAs.Message, settings.WarningCodesAsMessage)); } // set project file extensions to ignore when searching for project file if (settings.IgnoreProjectExtensions.Any()) { builder.AppendMSBuildSwitch("ignoreprojectextensions", string.Join(",", settings.IgnoreProjectExtensions)); } // detailed summary? if (settings.DetailedSummary) { builder.AppendMSBuildSwitch("detailedsummary"); } // Include response files? foreach (var responseFile in settings.ResponseFiles) { builder.AppendSwitchQuoted("@", string.Empty, responseFile.MakeAbsolute(environment).FullPath); } // exclude auto response files? if (settings.ExcludeAutoResponseFiles) { builder.AppendMSBuildSwitch("noautoresponse"); } // don't output MSBuild logo? if (settings.NoLogo) { builder.AppendMSBuildSwitch("nologo"); } // Set Continuous Integration Build? if (settings.ContinuousIntegrationBuild.HasValue) { var continuousIntegrationBuild = settings.ContinuousIntegrationBuild.Value ? "true" : "false"; builder.AppendMSBuildSwitch("property", $"ContinuousIntegrationBuild={continuousIntegrationBuild}"); } }