2013-03-28 8 views
5

Mam niestandardową regułę kompilacji w VS2010 dla mojego projektu VC++. Zgodnie z tą zasadą chciałbym zezwolić użytkownikom na dodawanie złożonych warunków określających, czy plik jest przetwarzany.Jak mogę odsłonić "Warunki" MSBuild w VS2010 (dla vC++)

Należy to również ocenić w czasie realizacji celu, a nie w "Warunku" samego elementu (z uwagi na fakt, że tylko projekt "aplikacja" może go przetworzyć i musi go przetworzyć z ustawieniami projektu "aplikacja", a nie zależnymi projektami).

Próbowałem dodać pole niestandardowe do obiektu, a następnie po prostu usunąć elementy z grupy w czasie wykonywania. np.

<ItemGroup> 
    <MyItemType Remove="@(MyItemType)" Condition="!(%(MyItemType.IncludeCondition))" /> 
</ItemGroup> 

Niestety, to daje mi błąd:

błąd MSB4113: "(% (MyItemType.IncludeCondition))" określono warunek jest " 'testfilename1' == 'testfilename2' lub fałszywe!" zamiast wartości boolowskiej.

(Stan oryginalny wyraz w „% (MyItemType.IncludeCondition)” był '%(Filename)' == 'testfilename2' or $(TestBooleanFalse))

Wydaje się, że MSBuild nie oceni zawartości metadanych elementu na wartość logiczną (co wydaje się dobre praktyki większość okoliczności, po prostu nie ten).

Czy mimo to mogę uzyskać MSbuild, aby rzeczywiście ocenić metadane na wartość boolowską, lub czy istnieje inna metoda, której można użyć do uzyskania tego samego wyniku?


P.S. miałem krótkie spojrzenie przez MSBuild Property Functions, ale nie dostrzegł niczego, co mogłoby uruchomić kod logiczną oceny MSBuild nad wejściem funkcja)


bardzo okrojone przykładem projektu MSBuild ukazującą kwestia, dzięki uprzejmości Lanrokin:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> 
    <ItemGroup> 
     <MyItemType Include="item1.ext1" /> 
     <MyItemType Include="item1.ext2" /> 
    </ItemGroup> 

    <Target Name="SpecifyConditions"> 
     <ItemGroup> 
      <MyItemType> 
       <IncludeCondition>'%(Filename)%(Extension)' == 'item1.ext1'</IncludeCondition> 
      </MyItemType> 
     </ItemGroup> 
    </Target> 

    <Target Name="Build" DependsOnTargets="SpecifyConditions"> 
     <Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition)" /> 
    </Target> 
</Project> 
+0

próbowano edytować posta, ale została ona odrzucona. Sprawdź, czy jest coś, co chcesz zrobić do pracy http://pastebin.com/nkdz80y5 i rozważ dodanie tej próbki do pytania. – Lanorkin

+0

@Lanorkin - Dzięki, że w podanym przykładzie pojawił się drobny błąd, ale pokazuje problem I ' m mając. (Mam nadzieję, że ludzie nie tylko odpowiedzą i powiedzą, aby zmienić "ItemGroup" w "SpecifyConditions" na "Remove" z warunkiem określonym jako warunek deklaracji "MyItemType"). –

Odpowiedz

0

Spróbuj zadeklarować warunki inline zamiast metadane produktu:

<ItemGroup> 
    <MyItemType Remove="@(MyItemType)" Condition="('%(MyItemType.Filename)' == 'testfilename2')" /> 
    </ItemGroup> 

Lub użyć Property Functions w stanie Metadane:

<Target Name="SpecifyConditions"> 
    <ItemGroup> 
     <MyItemType> 
      <IncludeCondition>$([System.String]::Equals('%(Filename)%(Extension)', 'item1.ext1'))</IncludeCondition> 
     </MyItemType> 
    </ItemGroup> 
</Target> 

<Target Name="Build" DependsOnTargets="SpecifyConditions"> 
    <Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition)" /> 
</Target> 
+0

Nie mogę tego zrobić, ponieważ warunki są zdefiniowany przez użytkownika dla pliku (jak zaznaczono w drugim zdaniu w pytaniu oryginalnym). –

+0

Czy to działa: 'Condition =" '(% (MyItemType.IncludeCondition))' == 'False' "' – KMoraz

+0

nie, chodzi o to, że '% (MyItemType.IncludeCondition)' rozwinięty jako 'string' zamiast boolean, chociaż nie jest oceniany – Lanorkin

0

myślę mały uszczypnąć swojego warunkowego oświadczenia od:

'%(Filename)' == 'testfilename2' or $(TestBooleanFalse) 

do

('%(Filename)' == 'testfilename2') or $(TestBooleanFalse) 

owijając pierwszy warunek wewnątrz wspornik rozwiąże problem.

+0

Nie, nie będzie. Możesz spróbować użyć przykładu tutaj http://pastebin.com/nkdz80y5 aby sprawdzić – Lanorkin

1

Jest to związane ze sposobem oceny MSBuild. Zobacz książkę Sayeda, aby uzyskać więcej informacji: Inside the Microsoft® Build Engine: Using MSBuild and Team Foundation Build

Przesuwając lokalizację stanu w próbce, możesz osiągnąć to, co myślę, że próbujesz osiągnąć.

<Target Name="SpecifyConditions"> 
    <ItemGroup> 
     <MyItemType Condition="'%(Filename)%(Extension)' == 'item1.ext1'"> 
      <IncludeCondition>true</IncludeCondition> 
     </MyItemType> 
    </ItemGroup> 
</Target> 

<Target Name="Build" DependsOnTargets="SpecifyConditions"> 
    <Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition) == 'true'" /> 
</Target> 

+0

W takim rozwiązaniu nadal tworzymy msbuild aby obliczyć warunek w zadaniu 'SpecifyConditions', podczas gdy idea ma" pass "warunek jako parametr, tak aby był oblicza się w zadaniu 'Build'. – Lanorkin

Powiązane problemy