[英]I want to create ChooseElement for .csproj with MSBuild How?
[英]How do I test for compiler directives with an MSBuild Condition in a .csproj file?
我對.csproj文件中的功能和條件完全陌生,因此不勝感激。
我想做的是檢查當前配置中的特定編譯器指令。 一個示例如下所示:
<Choose>
<When Condition= [current configuration has CONST-1 compiler constant defined] >
...
</When>
<When Condition= [current configuration has CONST-2 compiler constant defined] >
...
</When>
</Choose>
我不知道這是否可能。 如果有更好的方法來做我要問的事情,也請告訴我。 無論哪種方式,我都想測試獨立於配置的條件。
編輯
我真正想要的是一個可以輕松編輯的值(最好是在Visual Studio中),我還可以檢查配置的無條件設置。 我考慮過編譯器常量,因為您可以在VS的項目屬性中輕松更改它們。
編譯器常量設置為屬性“ DefineConstants”,因此您應該只可以評估該屬性。 您的Choose
語句需要放在定義常量的PropertyGroup或目標內部。
<Choose>
<When Condition="$(DefineConstants.Contains(CONST-1))">
...
</When>
<When Condition="$(DefineConstants.Contains(CONST-2))">
...
</When>
</Choose>
如果您使用MSBuild 4或更高版本,我建議使用正則表達式而不是String.Contains()。 原因是,即使String.Contains()通常可以很好地工作,在某些情況下您也可能會遇到問題。
例如:
當在代碼中使用指令CONST-1和CONST-12時,請考慮大小寫。 但是,您決定只為當前構建定義CONST-12指令。
現在,即使未定義CONST-1, Condition="$(DefineConstants.Contains('CONST-1'))"
計算結果也為True
。
使用RegularExpressions.RegEx
解決方案:
<When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*CONST-1(;.*)*$'))">
...
</When>
總結起來,您可以小心確保不要使用另一個指令的Substring指令,也可以使用正則表達式而不用擔心。
要添加到此處發布的其他答案,您可以采用的另一種方法是用分號包裝DefineConstants屬性,以確保“; CONST-1;” 當且僅當定義了“ CONST-1”常量時,它將包含在DefineConstants中。 如果沒有分號,則可以將CONST-100或UNCONST-1作為變量,而不能將CONST-1作為變量,並且其評估結果為true。
<PropertyGroup>
<DefineConstants2>;$(DefineConstants);</DefineConstants2>
<Foo Condition="'$(DefineConstants2.Contains(`;CONST-1;`))'">It worked</Foo>
<Bar>$(Foo)</Bar> <!--It worked-->
</PropertyGroup>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.