Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否替换MSBuild中某项的内容?_C#_.net_Build_Msbuild_Msbuild Task - Fatal编程技术网

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>