![](/img/trans.png)
[英]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.