如何创建一个msbuild“任务”来很好地格式化输出

时间:2014-07-24 07:38:28

标签: msbuild

问题

我的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"/>

将是下一个最好的事情。


到目前为止我发现了

&#34; best&#34;我到目前为止找到的是"inline tasks"。 但我真的需要编写c#代码来完成工作吗?它只是一些简单的字符串连接,...

同样使用自定义任务几乎就像复制代码一样繁琐,我想它看起来像这样:

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

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

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

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

<WarnInBox Text="CLEAN UP" Condition="..." />

<ErrorInBox Text="CLEAN UP" Condition = "..." />

但是这将使得有必要复制一些参数并将它们传递。此外,MessageInBoxWarnInBoxErrorInBox任务仍然存在代码重复。

问题

如何为消费者实现最简单的界面?如何最好地减少代码冗余? 我之前发现的那种方法真的没有更好的方法吗?我可以创建一个由msbuild xml组成的msbuild任务,而不是C#或VB.net或Javascript或诸如此类的东西吗?

1 个答案:

答案 0 :(得分:1)

<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>