如何创建msbuild“;任务“;很好地格式化输出

如何创建msbuild“;任务“;很好地格式化输出,msbuild,Msbuild,问题 我的msbuild文件中到处都有这样的代码: <Message Text="$(NewLine)==============================================$(NewLine)" Importance="High" /> <Message Text=" CLEAN UP " Importance="High" /> <Message Text="$(NewLine

问题

我的msbuild文件中到处都有这样的代码:

<Message
    Text="$(NewLine)==============================================$(NewLine)"
    Importance="High" />
<Message
    Text="       CLEAN UP        "
    Importance="High" />
<Message
    Text="$(NewLine)==============================================$(NewLine)"
    Importance="High" />

目标

现在,我想协调输出,减少代码冗余,并将消息格式逻辑提取到某种任务中

这就是我想象的用法:

<Message Text="$(PrintInBox(CLEAN UP))" Importance="High"/>

这样我也可以在中重用它

<Error Text="$(PrintInBox(CLEAN UP))"/>

如果这绝对不可能,比如

<PrintInBox Text="CLEAN UP"/>

这将是下一个最好的选择


到目前为止我的发现

到目前为止,我发现的“最好的”事情是。 但我真的需要编写c代码来完成这项工作吗?这只是一些简单的字符串连接

此外,使用自定义任务几乎与复制整个代码一样麻烦,我猜它看起来像这样:

<FormatInBox Text="CLEAN UP">
    <Output TaskParameter="Result" ItemName="FormattedText"/>
</FormatInBox>

<Message Text="@(FormattedText)" Importance="High"/>

或者如果我创建了更具体的任务:

<MessageInBox Text="CLEAN UP" Importance="High" />



但这就需要复制一些参数并传递它们。此外,在
MessageInBox
warnibox
ErrorInBox
任务中仍然存在代码重复

问题

如何为消费者实现最简单的界面?如何才能最好地减少代码冗余? 真的没有比我以前找到的更好的方法了吗?我是否可以创建一个由msbuild xml组成的msbuild任务,而不是C#或VB.net或Javascript之类的
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Box>==============================================&#10;       Text&#10;==============================================</Box>
  </PropertyGroup>

  <Target Name="Foo">
    <Message Text="$(Box.Replace(Text, CLEAN UP 1))" Importance="High" />
    <Warning Text="$(Box.Replace(Text, CLEAN UP 2))" />
    <Error Text="$(Box.Replace(Text, CLEAN UP 3))" />
  </Target>
</Project>
============================================== 正文 ==============================================
谢谢。但我如何调用它并传递参数(“清理”)?据我所知,
CallTarget
不能用于传递参数。此外,属性和项目定义仅在目标完成后对其他目标可见。哦,好吧,我现在意识到我可以在
Foo
目标之外定义
Box
属性,也就是说“全局”。然后我可以在任何我喜欢的地方使用“$(Box.Replace(Text,CLEAN UP 3))”。@BatteryBackupUnit是的,您可以在任何地方定义或重新定义它。就我个人而言,我有一个自定义的任务和资源文件,其中包含了头文件,有时甚至嵌入了cygwin版本的。
<ErrorInBox Text="CLEAN UP" Condition = "..." />
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Box>==============================================&#10;       Text&#10;==============================================</Box>
  </PropertyGroup>

  <Target Name="Foo">
    <Message Text="$(Box.Replace(Text, CLEAN UP 1))" Importance="High" />
    <Warning Text="$(Box.Replace(Text, CLEAN UP 2))" />
    <Error Text="$(Box.Replace(Text, CLEAN UP 3))" />
  </Target>
</Project>