如何从正在处理的项目文件中访问msbuild命令行参数?

ara*_*orn 9 msbuild project command-line-arguments msbuild-4.0

我需要从正在处理的项目文件中访问msbuild命令行参数(特别是指定的目标和属性),以便将它们传递给<MSBuild>任务的属性.

我的msbuild文件使用了大量的属性,我不知道哪些属性会被命令行覆盖,所以我正在寻找一种方法来传递这些属性而不用手动指定每个属性<MSBuild>任务.类似于bat文件中的$*变量.

我怎么能做到这一点?

wei*_*eir 0

这个问题很古老,但 FWIW 这是我处理获取 MSBuild 命令行参数的方式:

选项1(不推荐)

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

问题是这样在使用的时候会出现下面的错误dotnet build

'MSB4185:类型“System.Environment”上的函数“CommandLine”不可作为 MSBuild 属性函数执行。

选项 2(FTW)

创建任务

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用任务为每个参数创建一个项目

<GetCommandLineArgs>
  <Output TaskParameter="CommandLineArgs" ItemName="CommandLineArg" />
</GetCommandLineArgs>
Run Code Online (Sandbox Code Playgroud)

(可选)将参数重构为单个字符串

<PropertyGroup>
  <CommandLineArgs>@(CommandLineArg, ' ')</CommandLineArgs>
<PropertyGroup>
Run Code Online (Sandbox Code Playgroud)