2013-01-31 29 views
1

我已經寫在CSHARPMSbuild,如何訪問內聯任務代碼中的項目屬性值?

不知聯任務的代碼是否有無論如何訪問前景展望財產聯任務代碼

對於離。我試圖用項目屬性值替換字符串匹配。可能嗎?

<![CDATA[ 
     MatchCollection matches = Regex.Matches(SourceStr, Pattern); 

     for (int i = 0; i < matches.Count; i++) 
      // replace the match value with project property... possible? 


    ]]> 

回答

1

將它作爲參數傳遞,就像你使用編譯任務一樣?

<ParameterGroup> 
    <Foo ParameterType="System.Bar" Required="true" /> 
<ParameterGroup> 

編輯:看起來像簡單的行內標記工作太。

<![CDATA[ 
    Console.WriteLine("$(Foo)"); 
]]> 
+0

我有第二個跟進的問題..你會介意幫這個? –

0

MSDN documentation中有例子。例如:

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

如果$(MyValue)是一個項目的屬性,你可以這樣做:

<TokenReplace Path="C:\Project\Target.config" Token="$MyToken$" Replacement="$(MyValue)"/> 
+0

我有第二個後續問題..你會介意幫助嗎? –

2

太大要回複評論。

它是空的原因與您的其他問題 - 評估順序一樣。代碼在擊中目標之前進行評估和標記,我假設這是您設置值並設置屬性的位置。

如果我明白你要完成的任務,請看下面的示例,只需將它們作爲屬性傳遞並作爲輸出傳遞出去。

這就是說,我認爲你應該看看屬性函數首先,爲自己節省一堆麻煩。

http://msdn.microsoft.com/en-us/library/dd633440.aspx

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

嗯...我不能通過它作爲參數的原因是'價值 –

+0

價值將是未知的,直到我找到'匹配'。值是在搜索模式時決定的,因爲我想要替換多個不同的字符串模式... –

相關問題