【问题标题】:How do I test for compiler directives with an MSBuild Condition in a .csproj file?如何在 .csproj 文件中使用 MSBuild 条件测试编译器指令?
【发布时间】:2012-10-09 01:16:59
【问题描述】:

我对 .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 的项目属性中轻松更改它们。

【问题讨论】:

  • 可能更常见的是使用Property 元素。您的 csproj 文件将已经有条件 PropertyGroup 元素,具体取决于配置。在其中,您可以添加新的自定义 Property 元素,并且可以在 Condition= 属性中以通常的方式测试它们。这对你有用吗,还是你真的需要编译器指令?它们更复杂,因为可以通过多种方式定义它们。
  • 可能。有没有办法在我添加自定义属性元素后,在 VS 中轻松编辑它们,而无需每次我想更改它们时都编辑 .csproj 文件?
  • 我想要的是一个定义的值,无论配置是什么,我都可以更改和检查。
  • 不,没有办法从 GUI 编辑自定义属性,除非你想创建一个 VS 插件(一些插件确实添加属性,并将它们作为项目属性中的新选项卡提供,但那是可能工作太多)

标签: c# msbuild csproj compiler-directives


【解决方案1】:

编译器常量设置为属性“DefineConstants”,因此您应该能够评估该属性。您的 Choose 语句需要在定义常量或在目标内部的 PropertyGroups 之后。

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

【讨论】:

  • 谢谢这工作得很好......但是我不得不删除 CONST-1 周围的引号或任何条件定义
【解决方案2】:

如果您使用 MSBuild 4 或更高版本,我建议使用正则表达式而不是 String.Contains()。原因是尽管 String.Contains() 通常运行良好,但在某些情况下您可能会遇到问题。

例如:

考虑在代码中使用指令 CONST-1 和 CONST-12 时的情况。但是,您决定为当前构建仅定义 CONST-12 指令。
现在Condition="$(DefineConstants.Contains('CONST-1'))" 的计算结果为True,即使没有定义 CONST-1。

RegularExpressions.RegEx 的解决方案:

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

总而言之,您可以小心确保不使用以下指令 另一个的子字符串,或者您可以使用正则表达式而完全不用担心。

【讨论】:

  • 这是唯一适用于目标文件的 System.Text.RegularExpressions.Regex,谢谢:“"
【解决方案3】:

要添加到此处发布的其他答案,另一种方法是使用分号包装 DefineConstants 属性,以保证“;CONST-1;”当且仅当定义了“CONST-1”常量时,才会包含在 DefineConstants 中。如果没有分号,您可以将 CONST-100 或 UNCONST-1,但不是 CONST-1 作为变量,它的计算结果为真。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2023-03-23
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多