Msbuild 是否可以反转ItemGroup元素的顺序?
在MSBuild 3.5中,是否可以反转ItemGroup中元素的顺序 示例 我有两个项目。一个可以独立构建,另一个依赖于第一个。每个项目在.targets文件中引用其特定项 项目目标Msbuild 是否可以反转ItemGroup元素的顺序?,msbuild,Msbuild,在MSBuild 3.5中,是否可以反转ItemGroup中元素的顺序 示例 我有两个项目。一个可以独立构建,另一个依赖于第一个。每个项目在.targets文件中引用其特定项 项目目标 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <AssembliesToRemove Include="@(AssembliesToRemov
<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 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 xmlns="...">
<ItemGroup>
<AssembliesToRemove Include="@(AssembliesToRemove)" />
<AssembliesToRemove Include="Assembly_A.dll">
<ApplicationName>App_A</ApplicationName>
</AssembliesToRemove>
</ItemGroup>
</Project>
<Project xmlns="...">
<ItemGroup>
<AssembliesToDeploy Include="@(AssembliesToDeploy)" />
<AssembliesToDeploy Include="Assembly_A.dll">
<AssemblyType>SomeType</AssemblyType>
<ApplicationName>App_A</ApplicationName>
</AssembliesToDeploy>
</ItemGroup>
</Project>
但是当在project_B.proj中使用project_B.targets时,@(AssembliesToDeploy)
中的顺序仍然是Assembly_A.dll;汇编_B.dll。
编辑
正如MadGnome指出的那样,这是行不通的,因为在@(AssembliesToDeploy)
是否有一种解决方案允许重用我的.targets,即不将所有ItemGroup元素复制到所有.targets文件?您只需在
项目a
之前包含项目B.targets
<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>
基类型
附录B
您正在使用
Import
,因此如果您使用上面的代码,您将在集合中有重复项来部署采用MadGnomes answer我决定将项目组拆分为单独的.target文件
项目\u A\u删除。目标
<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 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 xmlns="...">
<ItemGroup>
<AssembliesToRemove Include="@(AssembliesToRemove)" />
<AssembliesToRemove Include="Assembly_A.dll">
<ApplicationName>App_A</ApplicationName>
</AssembliesToRemove>
</ItemGroup>
</Project>
<Project xmlns="...">
<ItemGroup>
<AssembliesToDeploy Include="@(AssembliesToDeploy)" />
<AssembliesToDeploy Include="Assembly_A.dll">
<AssemblyType>SomeType</AssemblyType>
<ApplicationName>App_A</ApplicationName>
</AssembliesToDeploy>
</ItemGroup>
</Project>
附录A
项目部署。目标
<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 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 xmlns="...">
<ItemGroup>
<AssembliesToRemove Include="@(AssembliesToRemove)" />
<AssembliesToRemove Include="Assembly_A.dll">
<ApplicationName>App_A</ApplicationName>
</AssembliesToRemove>
</ItemGroup>
</Project>
<Project xmlns="...">
<ItemGroup>
<AssembliesToDeploy Include="@(AssembliesToDeploy)" />
<AssembliesToDeploy Include="Assembly_A.dll">
<AssemblyType>SomeType</AssemblyType>
<ApplicationName>App_A</ApplicationName>
</AssembliesToDeploy>
</ItemGroup>
</Project>
基类型
附录A
项目B的目标也是如此
项目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。如果我更改导入顺序,那么在处理@(AssembliesToDeploy)
时,我也会遇到同样的问题。您完全正确,我的尝试将导致重复-导致Assembly_A.dll仍在Assembly_B.dll之前部署。所以你的回答并没有解决我的问题,但是在我的方法中发现了缺陷。当然,如果我更改导入顺序,那就是@(AssembliesToRemove)
。。。ctrl-c ctrl V感谢您的提示。为了完整起见,我添加了最后的(?)解作为新的答案。
的意义是什么?把已经存在的东西放在那里?