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

9
我需要从正在处理的项目文件中获取msbuild命令行参数(尤其是指定的目标和属性),以便将它们传递给任务的属性。我的msbuild文件使用了许多属性,而我事先不知道哪些属性会被命令行覆盖,因此我正在寻找一种方法,在不手动指定每个属性到任务属性的情况下传递它们。就像bat文件中的$*变量一样。我该如何实现这一点?

你还发现了其他什么吗?我和你的情况完全一样... 我需要从目标内部调用nuget.exe,并希望传递从外部设置的任何属性。 - julealgon
我也是。我可以在使用TFS构建时获取值,但无法从使用发布配置文件的VS中获取。 - SAS
1个回答

0

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

选项 1(不推荐)

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

问题在于,使用 dotnet build 时,这将导致以下错误。

'MSB4185:类型为“System.Environment”的“CommandLine”函数无法用作 MSBuild 属性函数执行。'

第二种选择(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;
    }
}

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

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

可选地,将参数重构为单个字符串

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接