2015-02-04 4 views
1

나는 (예를 들어 그 내용을 표시하기 전에) 어떤 것을하기 전에 특정 방식으로 정렬하고 싶은 Item List를 가지고있다. 나는 그렇게 할 수있는 사용자 지정 작업을 작성했습니다, 다음과 같이 대상에서 사용할 때 그것을 잘 작동합니다 :MSBuild의 항목 내용 바꾸기?

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

을 그리고 나는 "정렬"는 InitialTarget을 대상으로 만들 수보다는 새로운 아이템을 m 이전에 실행 "List"와 같은 모든 대상에 SortProjects 작업을 넣지 않고 "List"와 같은 다른 대상을 빌드하려고합니다.

불행히도 Output을 @ (Projects)로 지정하려고하면 @ (Projects)의 내용을 덮어 쓰지 않습니다. 대신, 그것은 그것들을 추가합니다. 그래서 ListProjects 정렬 된 프로젝트에 의해 정렬되지 않은 프로젝트를 나열합니다. 나는 이것이 SortProjects 작업의 명백한 알고리즘상의 실수로 인한 것이 아니라고 확신한다.

내용을 추가하는 대신 내용을 바꿀 수있는 방법이 있습니까? 또는, 더 일반적으로, 내가 여기에서하려고하는 것을 이루기위한 다른 방법? 감사.

답변

0

매번 정렬 할 필요가 없습니다. DependsOnTargets 특성을 사용하여 Sort 타겟이 특정 타겟 전에 호출되도록 지정하십시오. 이렇게하면 여러 번 사용하면 단 한 번 호출됩니다.

0

사용 (만 대상 내부에 적용) 항목의 속성을 제거 : 각 ItemGroup이 목표 내에서 정의 된 경우에도 전역 범위에 속한다는 것을

<Target Name="List"> 
    <SortProjects In="@(Projects)"> 
    <Output ItemName="SortedProjects" TaskParameter="Out"/> 
    </SortProjects> 
    <ItemGroup> 
    <Projects Remove="@(Projects)"/> 
    <Projects Include="@(SortedProjects)"/> 
    </ItemGroup> 
</Target> 

참고.