MSbuild,如何在内联任务代码中访问项目属性值?
我用csharp编写了内联任务代码 我想知道在内联任务代码中是否还有访问propect属性的方法 例如,我试图用项目属性值替换字符串匹配。可能吗MSbuild,如何在内联任务代码中访问项目属性值?,msbuild,msbuild-task,msbuild-propertygroup,Msbuild,Msbuild Task,Msbuild Propertygroup,我用csharp编写了内联任务代码 我想知道在内联任务代码中是否还有访问propect属性的方法 例如,我试图用项目属性值替换字符串匹配。可能吗 <![CDATA[ MatchCollection matches = Regex.Matches(SourceStr, Pattern); for (int i = 0; i < matches.Count; i++) // replace the match value with proj
<![CDATA[
MatchCollection matches = Regex.Matches(SourceStr, Pattern);
for (int i = 0; i < matches.Count; i++)
// replace the match value with project property... possible?
]]>
将其作为参数传递,就像在编译任务中一样
<ParameterGroup>
<Foo ParameterType="System.Bar" Required="true" />
<ParameterGroup>
编辑:看起来简单的内联标记也可以工作
<![CDATA[
Console.WriteLine("$(Foo)");
]]>
中有一些示例。例如:
<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="4.0">
<UsingTask TaskName="TokenReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<Path ParameterType="System.String" Required="true" />
<Token ParameterType="System.String" Required="true" />
<Replacement ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs">
<![CDATA[
string content = File.ReadAllText(Path);
content = content.Replace(Token, Replacement);
File.WriteAllText(Path, content);
]]>
</Code>
</Task>
</UsingTask>
<Target Name='Demo' >
<TokenReplace Path="C:\Project\Target.config" Token="$MyToken$" Replacement="MyValue"/>
</Target>
</Project>
太大,无法作为评论回复 它为空的原因和你们的另一个问题一样——评估顺序。在命中目标之前对代码进行评估和标记化,我假设这就是您设置值和属性的地方 如果我理解了您试图通过任务实现的目标,请看下面的示例,将它们作为属性传入,作为输出传出即可 这就是说,我认为你应该首先研究属性函数,省去你自己一大堆麻烦
().选择(m=>m.Value).ToList();
matches.ForEach(m=>Log.LogMessage(“{0}->{1}”,m,Value));
宏=匹配项。选择(m=>newtaskItem(m)).ToArray();
SourceStr=regex.Replace(SourceStr,Value);
]]>
酒吧
Z
hmmm。。。我无法将其作为参数传递的原因是“在找到“匹配项”之前,valuevalue将是未知的”。值是在搜索模式时确定的,因为我想替换多个不同的字符串模式。。。
<TokenReplace Path="C:\Project\Target.config" Token="$MyToken$" Replacement="$(MyValue)"/>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="Foo" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<SourceStr Required="true" Output="true" />
<Pattern Required="true" />
<Value Required="true" />
<Macros ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.Linq" />
<Using Namespace="System.Text.RegularExpressions" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var regex = new Regex(Pattern);
var matches = regex.Matches(SourceStr).Cast<Match>().Select(m => m.Value).ToList();
matches.ForEach(m => Log.LogMessage("{0} -> {1}", m, Value));
Macros = matches.Select(m => new TaskItem(m)).ToArray();
SourceStr = regex.Replace(SourceStr, Value);
]]>
</Code>
</Task>
</UsingTask>
<Target Name="Foo">
<PropertyGroup>
<SourceStr>Bar</SourceStr>
<Value>z</Value>
</PropertyGroup>
<Message Text="in $(SourceStr)" />
<Foo SourceStr="$(SourceStr)" Pattern="r$" Value="$(Value)">
<Output TaskParameter="SourceStr" PropertyName="SourceStr" />
<Output TaskParameter="Macros" ItemName="Macros" />
</Foo>
<Message Text="out $(SourceStr)" />
<Message Text="sans %(Macros.Identity)" />
</Target>
</Project>