簡體   English   中英

如何在.csproj文件中使用MSBuild條件測試編譯器指令?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM