2012-10-18 14 views
10

Jestem całkowicie nowy w funkcjach i warunkach w plikach .csproj, więc każda pomoc jest doceniana.Jak przetestować dyrektywy kompilatora ze stanem MSBuild w pliku .csproj?

Co chcę zrobić, to sprawdzić dla konkretnej dyrektywy kompilatora w bieżącej konfiguracji. Przykładem może być coś takiego:

<Choose> 
    <When Condition= [current configuration has CONST-1 compiler constant defined] > 
     ... 
    </When> 
    <When Condition= [current configuration has CONST-2 compiler constant defined] > 
     ... 
    </When> 
</Choose> 

Nie wiem, czy to możliwe, czy nie. Jeśli istnieje lepszy sposób robienia tego, o co pytam, daj mi znać również. Tak czy inaczej, chcę przetestować dla warunku niezależny konfiguracji.

EDIT

Co naprawdę chcę to wartość, którą można łatwo zmieniać, a najlepiej w ciągu Visual Studio, które można również sprawdzić regargless z configuraiton. Myślałem o stałych kompilatora, ponieważ można je łatwo zmienić w oknie Właściwości projektu w VS.

+0

Prawdopodobnie bardziej powszechnym byłoby użycie elementu "Właściwość". Twój plik csproj będzie już mieć zależne od konfiguracji elementy warunkowe 'PropertyGroup'. Wewnątrz nich możesz dodać nowe niestandardowe elementy 'Property' i możesz je przetestować w zwykły sposób w swoim atrybucie' Condition = '. Czy to działałoby dla Ciebie, czy naprawdę potrzebujesz dyrektyw kompilatora? Są bardziej skomplikowane, ponieważ istnieją różne sposoby ich zdefiniowania. – hvd

+0

To może. Czy istnieje sposób edytowania niestandardowych elementów właściwości, po ich dodaniu, w VS bez konieczności edytowania pliku .csproj za każdym razem, gdy chcę je zmienić? –

+0

Potrzebuję zdefiniowanej wartości, którą mogę zmienić i sprawdzić bez względu na konfigurację. –

Odpowiedz

8

stałe kompilatora są ustawione pod Właściwość „DefineConstants” więc należy po prostu być w stanie ocenić tę właściwość. Twoja instrukcja Choose musi przejść po grupach właściwości PropertyGroups, które definiują stałe lub wewnątrz obiektu docelowego.

<Choose> 
    <When Condition="$(DefineConstants.Contains(CONST-1))"> 
     ... 
    </When> 
    <When Condition="$(DefineConstants.Contains(CONST-2))"> 
     ... 
    </When> 
</Choose> 
+1

Dzięki to działało idealnie ... Jednak musiałem usunąć cytaty dotyczące CONST-1 lub jakiegokolwiek innego warunkowego zdefiniowania – Randeep

5

W przypadku korzystania z MSBuild 4 lub wyższy, proponuję przy użyciu wyrażeń regularnych zamiast String.Contains(). Powodem tego jest to, że chociaż String.Contains() zazwyczaj działa dobrze, są pewne przypadki, w których możesz napotkać problemy.

Na przykład:

Rozważmy przypadek, gdy używasz dyrektyw CONST-1 i CONST-12 w kodzie. Jednak zdecydujesz się zdefiniować tylko dyrektywę CONST-12 dla aktualnej kompilacji.
Teraz Condition="$(DefineConstants.Contains('CONST-1'))" ocenia na True, mimo że CONST-1 nie jest zdefiniowany.

Rozwiązanie z RegularExpressions.RegEx:

<When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*CONST-1(;.*)*$'))"> 
... 
</When> 

Podsumowując, można uważać, aby upewnić się, że nie korzystają z dyrektywy, która jest podłańcuchem inny albo można użyć wyrażenia regularnego i nie martwić się wszystko.

0

Aby dodać do innych opublikowanych tutaj odpowiedzi, innym sposobem podejścia do tego jest zawijanie właściwości DefineConstants średnikami, aby zagwarantować, że "; CONST-1;" będą zawarte w DefineConstants wtedy i tylko wtedy, gdy zdefiniowana jest stała "CONST-1". Bez średników mógłbyś mieć CONST-100 lub UNCONST-1, ale nie CONST-1, jako zmienną i byłaby to prawda.

<PropertyGroup> 
    <DefineConstants2>;$(DefineConstants);</DefineConstants2> 
    <Foo Condition="'$(DefineConstants2.Contains(`;CONST-1;`))'">It worked</Foo> 
    <Bar>$(Foo)</Bar> <!--It worked--> 
</PropertyGroup> 
Powiązane problemy