C# 是否替换MSBuild中某项的内容?
我有一个项目列表,在使用它做任何事情之前(例如,在显示它的内容之前),我希望以某种方式对它进行排序。我已经为此编写了一个自定义任务,在目标中使用它时效果很好,如下所示:C# 是否替换MSBuild中某项的内容?,c#,.net,build,msbuild,msbuild-task,C#,.net,Build,Msbuild,Msbuild Task,我有一个项目列表,在使用它做任何事情之前(例如,在显示它的内容之前),我希望以某种方式对它进行排序。我已经为此编写了一个自定义任务,在目标中使用它时效果很好,如下所示: <Target Name="List"> <SortProjects In="@(Projects)"> <Output ItemName="SortedProjects" TaskParameter="Out"/> </SortProjects> <Li
<Target Name="List">
<SortProjects In="@(Projects)">
<Output ItemName="SortedProjects" TaskParameter="Out"/>
</SortProjects>
<ListProjects In="@(SortedProjects)"/>
</Target>
这很好,但我真正想做的是修改@(项目)本身,而不是制作一个新项目:
<Target Name="List">
<SortProjects In="@(Projects)">
<Output ItemName="Projects" TaskParameter="Out"/>
</SortProjects>
<ListProjects In="@(Projects)"/>
</Target>
这样我就可以把事情分成多个目标:
<Target Name="Sort">
<SortProjects In="@(Projects)">
<Output ItemName="Projects" TaskParameter="Out"/>
</SortProjects>
</Target>
<Target Name="List">
<ListProjects In="@(Projects)"/>
</Target>
然后我可以将“Sort”目标设置为InitialTarget,这样它就可以在我打算构建的许多不同目标(如“List”)之前自动运行,而无需将SortProjects任务放入每个单独的目标(如“List”)中
不幸的是,当我试图将输出指向@(项目)时,它不会覆盖@(项目)的内容;相反,它是它们的附属品。因此,ListProjects列出未排序的项目,然后是已排序的项目。我很有信心这不是因为SortProjects任务中的一些明显的算法错误
有没有办法替换内容而不是附加到内容上?或者,更一般地说,用其他方式来完成我在这里要做的事情?谢谢 您不需要每次都进行排序。只需使用DependsOnTargets属性指定在特定目标之前调用排序目标。这样,如果您多次使用它,它只会被调用一次 使用项目的删除属性(仅适用于目标内部):
请注意,即使在目标中定义,每个项目组也属于全局范围
<Target Name="List">
<SortProjects In="@(Projects)">
<Output ItemName="SortedProjects" TaskParameter="Out"/>
</SortProjects>
<ItemGroup>
<Projects Remove="@(Projects)"/>
<Projects Include="@(SortedProjects)"/>
</ItemGroup>
</Target>