How to access the msbuild command line parameters

2019-03-19 18:22发布

问题:

I need to get access to the msbuild command line parameters (the specified targets and properties in particular) from within the project file being processed in order to pass them down to the Properties of an <MSBuild> task.

My msbuild file uses a large number of properties, and I don't know ahead of time which ones will be overridden via the command line, so I'm looking for a way to pass these down without specifying each one manually to the Properties of the <MSBuild> task. Something like the $* variable in a bat file.

How can I accomplish this?

回答1:

This question is ancient, but FWIW here is how I have handled getting the MSBuild command line parameters:

Option 1 (not recommended)

$([System.Environment]::CommandLine.Trim())

The problem is that this will cause the following error when using dotnet build.

'MSB4185: The function "CommandLine" on type "System.Environment" is not available for execution as an MSBuild property function.'

Option 2 (FTW)

Create a Task

using System;
using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

public sealed class GetCommandLineArgs : Task {
    [Output]
    public ITaskItem[] CommandLineArgs { get; private set; }

    public override bool Execute() {
        CommandLineArgs = Environment.GetCommandLineArgs().Select(a => new TaskItem(a)).ToArray();
        return true;
    }
}

Use the Task to create an Item for each argument

<GetCommandLineArgs>
  <Output TaskParameter="CommandLineArgs" ItemName="CommandLineArg" />
</GetCommandLineArgs>

Optionally, reconstruct the arguments into a single string

<PropertyGroup>
  <CommandLineArgs>@(CommandLineArg, ' ')</CommandLineArgs>
<PropertyGroup>