Gro*_*fit 6 c# msbuild msbuild-task
我认为这很简单但后来意识到我无法在任何地方找到任何信息.
我有这样的自定义任务:
public class MyCustomTask : Task
{
[Required]
public string[] SomeStrings {get;set;}
public override bool Execute()
{
// Do something with strings...
}
}
Run Code Online (Sandbox Code Playgroud)
匹配的MSBuild东西基本上是这样的:
<UsingTask TaskName="MyCustomTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<SomeStrings ParameterType="System.String[]" Required="true" />
</ParameterGroup>
<Task>
...
</Task>
</UsingTask>
<Target Name="DoSomething">
<MyCustomTask SomeStrings="????" />
</Target>
Run Code Online (Sandbox Code Playgroud)
不知道在SomeStrings参数中放什么,想想也许它会理解我是否做了"xxx,xxx,xxx"所以任何人都可以对此有所了解.基本场景很像标记,所以我需要一个字符串列表然后一些比较字符串,所以我需要传入2个列表/数组,但只是难倒.
gre*_*mac 10
@BrianKretzler完全没有使用ITaskItem,因为它是MSBuild在声明时所使用的<ItemGroup>
.
我只是想用一个完整的工作示例来清除答案,因为我在尝试完成同样的事情时找到了这篇文章并帮助了我.(搜索这些问题非常困难,因为关键字在不同的环境中使用,所以希望这会帮助其他人).
<UsingTask TaskName="MyCustomTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<SomeStrings ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
</ParameterGroup>
<Task>
<Code Type="Class" Language="cs"><![CDATA[
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class MyCustomTask : Task
{
public ITaskItem[] SomeStrings { get; set; }
public override bool Execute()
{
foreach (var item in SomeStrings)
{
Log.LogMessage(MessageImportance.High,
"Got item {0}",
item.ItemSpec);
Log.LogMessage(" -> {0} -> {1}",
item.GetMetadata("Comparison"),
item.GetMetadata("MoreDetail"));
}
return true;
}
}
]]></Code>
</Task>
</UsingTask>
Run Code Online (Sandbox Code Playgroud)
现在你可以用以下方法调用此任务:
<Target Name="DoSomething">
<ItemGroup>
<SomeStrings Include="first string">
<Comparison>first</Comparison>
</SomeStrings>
<SomeStrings Include="second string">
<Comparison>2nd</Comparison>
<MoreDetail>this is optional</MoreDetail>
</SomeStrings>
</ItemGroup>
<MyCustomTask SomeStrings="@(SomeStrings)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
输出是:
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.269]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
Build started 2012-10-19 5:41:22 PM.
Got first string
-> first ->
Got second string
-> 2nd -> this is optional
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:00.12
Run Code Online (Sandbox Code Playgroud)
您当然也可以使用类似的东西<ItemGroup><SomeStrings Include="**\*.txt" /></ItemGroup>
,您将获得匹配的文件名列表,当然您可以使用GetMetadata()来访问众所周知的文件元数据
目前尚不清楚你要做什么; 你有一个自定义任务的C#代码,还有与内联任务相同任务的MSBuild代码 - 你确实意识到你只需要做其中一个,对吗?如果您尝试在程序集中创建任务,则MSBuild中的<UsingTask>应为空元素,而不包含<ParameterGroup>和<Task>子项.如果您尝试使用内联任务,则不需要C#代码,并且需要将自己的程序集指定为AssemblyFile,而不是像您一样指定TaskFactory.
我将参数声明为ITaskItem []类型,因此您可以将值传入,
<MyCustomTask SomeStrings="@(SomeStrings)" />
Run Code Online (Sandbox Code Playgroud)
您可以将比较字符串设置为第二个参数中的第二个项目数组,或者作为第一个参数的元数据,例如
<ItemGroup>
<SomeStrings Include="first string">
<Comparison>first</Comparison>
</SomeStrings>
<SomeStrings Include="second string">
<Comparison>2nd</Comparison>
</SomeStrings>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
如果您使用的是内联代码,则需要<Reference>正确的MSBuild程序集并完全限定ParameterType.即使您的最终目的是使用内联代码,也要先在已编译的程序集中使用它.
归档时间: |
|
查看次数: |
7803 次 |
最近记录: |