2010-06-14 36 views
-2

在MSBuild 3.5中,是否可以顛倒ItemGroup中的順序元素?可能會顛倒ItemGroup元素的順序嗎?

我有2個項目。一個可以獨立建立,另一個依賴於第一個。每個項目在.targets文件中引用其特定項目。

project_A.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <AssembliesToRemove Include="@(AssembliesToRemove)" /> 
     <AssembliesToRemove Include="Assembly_A.dll"> 
      <ApplicationName>App_A</ApplicationName> 
     </AssembliesToRemove> 
    </ItemGroup> 

    <ItemGroup> 
     <AssembliesToDeploy Include="@(AssembliesToDeploy)" /> 
     <AssembliesToDeploy Include="Assembly_A.dll"> 
      <AssemblyType>SomeType</AssemblyType> 
      <ApplicationName>App_A</ApplicationName> 
     </AssembliesToDeploy> 
    </ItemGroup> 
</Project> 

project_B.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <AssembliesToRemove Include="@(AssembliesToRemove)" /> 
     <AssembliesToRemove Include="Assembly_B.dll"> 
      <ApplicationName>App_B</ApplicationName> 
     </AssembliesToRemove> 
    </ItemGroup> 

    <ItemGroup> 
     <AssembliesToDeploy Include="@(AssembliesToDeploy)" /> 
     <AssembliesToDeploy Include="Assembly_B.dll"> 
      <AssemblyType>SomeType</AssemblyType> 
      <ApplicationName>App_B</ApplicationName> 
     </AssembliesToDeploy> 
    </ItemGroup> 
</Project> 

project_A.proj

<Project DefaultTargets="Start" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="project_A.targets" /> 

    <Import Project="Common.targets" /> 
</Project> 

project_B.proj

<Project DefaultTargets="Start" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="project_A.targets" /> 

    <Import Project="project_B.targets" /> 

    <Import Project="Common.targets" /> 
</Project> 

的問題

在這種情況下的任務處理@(AssembliesToDeploy)過程中出現問題,因爲Assembly_B.dll需要Assembly_A.dll之前進行部署。

處理@(AssembliesToRemove)工作正常,因爲這裏的程序集按照正確的順序(在Assembly_B.dll之前刪除Assembly_A.dll)。

我試圖做

我試圖通過修改project_B.targets這樣的影響的 @(AssembliesToDeploy)順序:

<ItemGroup> 
    <AssembliesToDeploy Include="Assembly_B.dll"> 
     <AssemblyType>SomeType</AssemblyType> 
     <ApplicationName>App_B</ApplicationName> 
    </AssembliesToDeploy> 
    <AssembliesToDeploy Include="@(AssembliesToDeploy)" /> 
</ItemGroup> 

,但使用內project_B.proj project_B.targets時 @(AssembliesToDeploy)內部的命令仍然保持Assembly_A.dll; Assembly_B.dll。

編輯

由於MadGnome指出,這不行,因爲我會在@(AssembliesToDeploy)

與副本最終是否有解決方案,這將允許重用我.targets即不復制所有ItemGroup元素都包含到所有.targets文件中?

回答

1

您只需包括project_B.targets之前project_A

<Project DefaultTargets="Start" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="project_B.targets" /> 
    <Import Project="project_A.targets" />  

    <Import Project="Common.targets" /> 
</Project> 

我覺得這是在此代碼錯誤:

<ItemGroup> 
    <!-- Generates duplicates if used with Import --> 
    <AssembliesToDeploy Include="@(AssembliesToDeploy)" /> 

    <AssembliesToDeploy Include="Assembly_B.dll"> 
    <AssemblyType>SomeType</AssemblyType> 
    <ApplicationName>App_B</ApplicationName> 
    </AssembliesToDeploy> 
</ItemGroup> 

您使用Import,所以你如果你使用上面的代碼,你就必須複製在AssembliesToDeploy

+0

如果我chnage導入的順序,我會在處理'@(AssembliesToDeploy)'時遇到同樣的問題。你是絕對正確的,我的嘗試會導致重複 - 導致Assembly_A.dll仍然部署在Assembly_B.dll之前。所以你的回答並沒有解決我的問題,但發現我的方法存在缺陷。 – Filburt 2010-06-14 12:32:22

+0

當然,它是@(AssembliesToRemove)'如果我改變導入的順序... ctrl-c ctrl-v – Filburt 2010-06-14 12:43:28

+0

感謝您的提示。爲了完整起見,我添加了最終的解決方案(?)作爲新的答案。 – Filburt 2010-06-17 11:26:50

0

採用MadGnomes回答我決定將ItemGroups拆分爲單獨的.target文件。

project_A_REMOVE.targets

<Project xmlns="..."> 
    <ItemGroup> 
     <AssembliesToRemove Include="@(AssembliesToRemove)" /> 
     <AssembliesToRemove Include="Assembly_A.dll"> 
      <ApplicationName>App_A</ApplicationName> 
     </AssembliesToRemove> 
    </ItemGroup> 
</Project> 

project_A_DEPLOY.targets

<Project xmlns="..."> 
    <ItemGroup> 
     <AssembliesToDeploy Include="@(AssembliesToDeploy)" /> 
     <AssembliesToDeploy Include="Assembly_A.dll"> 
      <AssemblyType>SomeType</AssemblyType> 
      <ApplicationName>App_A</ApplicationName> 
     </AssembliesToDeploy> 
    </ItemGroup> 
</Project> 

與同爲project_B.targets。

project_B.proj現在看起來是這樣

<Project DefaultTargets="Start" xmlns="..."> 
    <Import Project="project_A_REMOVE.targets" /> 
    <Import Project="project_B_REMOVE.targets" /> 

    <Import Project="project_B_DEPLOY.targets" /> 
    <Import Project="project_A_DEPLOY.targets" /> 

    <Import Project="Common.targets" /> 
</Project> 

因爲我真正的解決辦法是由若干有58個項目,這將導致大量.targets的。更是如此,因爲我必須爲每個項目保留一個共同的.targets。