2011-08-03 2 views
8

Czy możliwe jest sprawdzanie zależności dla wielu wejść dla każdego wyjścia przy użyciu grupowania MSBuild?MSBuild grupowanie wielu wejść do każdego wyjścia

myślałem, że znaleźli rozwiązanie tego konstruując moją listę wejść w metadanych pliku wyjściowego, co następuje:

<ItemGroup> 
    <Foo Include="output1"> 
    <Inputs>input1a;input1b</Inputs> 
    </Foo> 
    <Foo Include="output2"> 
    <Inputs>input2a;input2b</Inputs> 
    </Foo> 
</ItemGroup> 

<Target Name="_CompileFoo" Outputs="@(Foo)" Inputs="%(Foo.Inputs)"> 
    <FooCompiler Src="%(Foo.Inputs)" Out="@(Foo)" /> 
</Target> 

Jednak MSBuild narzeka, że ​​plik „input1a; input1b” robi nie istnieje. Wydaje się, że konwersja string-> items ma miejsce przed oceną wyrażenia.

Czy jest jakieś rozwiązanie tego problemu, niż pisanie własnego sprawdzania zależności?

+0

Spróbuj usunąć atrybuty docelowe "Wyjścia" i "Wejścia". – Mrchief

+0

Następnie nie będzie sprawdzać zależności, zawsze będzie uruchamiał FooCompiler dla każdego elementu. –

+0

Gdzie jest sprawdzanie zależności? – Mrchief

Odpowiedz

18

Sprawdzanie wielu zależności działa, jeśli grupa elementów jest ustawiona w drugą stronę z wynikiem kompilacji jako metadanymi.

<ItemGroup> 
    <Foo Include="input1a"> 
    <Result>output1</Result> 
    </Foo> 
    <Foo Include="input1b"> 
    <Result>output1</Result> 
    </Foo> 
    <Foo Include="input2a"> 
    <Result>output2</Result> 
    </Foo> 
    <Foo Include="input2b"> 
    <Result>output2</Result> 
    </Foo> 
</ItemGroup> 

<Target Name="_CompileFoo" Inputs="@(Foo)" Outputs="%(Result)"> 
    <FooCompiler Overwrite="true" Src="@(Foo)" Out="%(Foo.Result)"/> 
</Target> 

I zamiast ręcznie przekształcenie grupy Foo artykuł, można przekształcić to w warunków wstępnych celu budowy nowego grupę pozycji _Foo następująco.

<ItemGroup> 
    <Foo Include="output1"> 
    <Inputs>input1a;input1b</Inputs> 
    </Foo> 
    <Foo Include="output2"> 
    <Inputs>input2a;input2b</Inputs> 
    </Foo> 
</ItemGroup> 

<Target Name="_PrepareItemsForCompileFoo"> 
    <ItemGroup> 
    <_Foo Include="%(Foo.Inputs)"> 
     <Result>%(Foo.Identity)</Result> 
    </_Foo> 
    </ItemGroup> 
</Target> 

<Target Name="_CompileFoo" DependsOnTargets="_PrepareItemsForCompileFoo" Inputs="@(_Foo)" Outputs="%(Result)"> 
    <FooCompiler Overwrite="true" Src="@(_Foo)" Out="%(_Foo.Result)"/> 
</Target> 
+0

To działało idealnie, dzięki! Elementy w moim przykładzie zostały faktycznie utworzone przez agregowanie innych elementów przy użyciu zadania C#. Dzięki waszemu drugiemu przykładowi udało mi się go wyeliminować. –