繁体   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