// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Diagnostics;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Microsoft.DotNet.Cli.Build.Framework;
namespace Microsoft.DotNet.Cli.Build
{
public abstract class DotNetTool : ToolTask
public DotNetTool()
}
protected abstract string Command { get; }
protected abstract string Args { get; }
protected override ProcessStartInfo GetProcessStartInfo(
string pathToTool,
string commandLineCommands,
string responseFileSwitch)
var psi = base.GetProcessStartInfo(
pathToTool,
commandLineCommands,
responseFileSwitch);
foreach (var environmentVariableName in new EnvironmentFilter().GetEnvironmentVariableNamesToRemove())
psi.Environment.Remove(environmentVariableName);
return psi;
public string WorkingDirectory { get; set; }
protected override string ToolName
get { return $"dotnet{Constants.ExeSuffix}"; }
protected override MessageImportance StandardOutputLoggingImportance
get { return MessageImportance.High; } // or else the output doesn't get logged by default
protected override string GenerateFullPathToTool()
string path = ToolPath;
// if ToolPath was not provided by the MSBuild script
if (string.IsNullOrEmpty(path))
Log.LogError($"Could not find the Path to {ToolName}");
return string.Empty;
return path;
protected override string GetWorkingDirectory()
return WorkingDirectory ?? base.GetWorkingDirectory();
protected override string GenerateCommandLineCommands()
var commandLineCommands = $"{Command} {Args}";
LogToolCommand($"[DotNetTool] {commandLineCommands}");
return commandLineCommands;
protected override void LogToolCommand(string message)
base.LogToolCommand($"{GetWorkingDirectory()}> {message}");