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

发布于 2024-09-10 02:41:32 字数 234 浏览 4 评论 0原文

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

我的 msbuild 文件使用大量属性,并且我不提前知道哪些属性将通过命令行覆盖,因此我正在寻找一种方法来传递这些属性,而无需手动将每个属性指定给属性任务。类似于bat 文件中的$* 变量。

我怎样才能做到这一点?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怀里藏娇 2024-09-17 02:41:32

这个问题很古老,但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;
    }
}

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

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

或者,将参数重建为单个字符串

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

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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文