【问题标题】:msbuild, defining Conditional Compilation Symbolsmsbuild,定义条件编译符号
【发布时间】:2010-10-03 13:25:01
【问题描述】:

我可能只是瞎了眼,但是有没有命令行可以在 MSBUILD 中指定条件编译符号?

我的构建脚本中目前有这条线:

SET MSBUILD=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
SET CONFIG=Debug
%MSBUILD% /p:Configuration=%CONFIG% /p:OutputPath=..\..\output source\MyProject\MyProject.csproj

我想添加一个条件。在 Visual Studio 中,我可以进入项目属性 => 构建 => 条件编译符号,但我没有看到 msbuild 的选项?

如果您知道我是否可以完全覆盖 .csproj 文件中已指定的所有符号以确保只有来自我的 Buildscript 的条件进入,则奖励 Karma。

【问题讨论】:

标签: .net msbuild compiler-options


【解决方案1】:

你见过this吗? (大部分信息在倒数第二个帖子中)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"

【讨论】:

  • 添加了代码,就是这样,谢谢!它覆盖了所有可能在 .csproj 文件中定义的常量,这也很好。
  • 为了让这个对我有用,我不得不将它添加到命令行:/t:Rebuild
  • 从 os x 终端使用 xbuild 我得到MSBUILD: error MSBUILD0005: Invalid syntax. Property name and value expected as <prop name>=[<prop value>]
  • 效果很好。 /p:DefineConstants="QCBUILD" 我的解决方案中有很多项目。这似乎是全球解决方案。有没有人想指出如何在使用 Visual Studio(不是命令行)时获得解决方案全局条件编译符号?
  • 请注意,这将替换现有定义,因此如果您依赖于定义的 NETCOREAPP 或 NETFRAMEWORK 等内容,您将失去这些。要附加到现有定义,最好在 .csproj 文件中添加一个属性,例如:<DefineConstants>$(DefineConstants);FOO;BAR</DefineConstants>
【解决方案2】:

我不得不使用空格而不是分号,就像 Björn Lasar 的这篇帖子一样:http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx

更新:博客消失了; retrieved via Internet Archive:

最近我不得不直接使用 MSBuild 来自动化一些构建。我还必须根据配置配置一些预处理器定义。这通常由这样的参数完成

"/p:DefineConstants=MY_PREPROC_FLAG"

这里没有什么特别的,因为网络上有足够多的 cmets。今天我还需要一个 Flag,我使用的命令行语法类似于我在 IDE 中所知道的:

"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG"

但是这个没有用。

所以重点是,如果您想通过命令行支持对项目的多个定义,则必须用简单的空格将它们分隔...

"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG" 

它将被添加到 IDE 的(分号分隔的)定义中。 很高兴知道我认为...

【讨论】:

  • @Brody 完成。 FWIW 接受的帖子(我赞成)可能更加内疚,但潮流还没有消失:D
  • 你如何测试这些符号的存在?我试过 if '$(SIGN_ASSEMBLY)' == '' goto :exit 但如果符号不存在,你会得到相同的空字符串。
  • @MikeDoonsebury 总是使用一个值的存在,以及它的特定值,即== "True" - 不知道你在 msbuild 中的 goto 退出是什么意思 - 相当于放置一个 @987654327 @ 在<Task 和/或任务调用上,例如<Exec Condtion="$(SignAssembly)=='True' ...
【解决方案3】:

/p:DefineConstants 是全有或全无的交易。

如果你只是想关闭跟踪符号,你不能这样做:msbuild /p:DefineTrace=false

你必须定义一些东西来覆盖所有已经定义的符号:msbuild /p:DefineConstants="RANDOM-SYMBOL"

感谢 Michael Stum 指出这个隐藏的排除 I have also wrote a blog about it --- dead link

【讨论】:

  • “所有符号”在这里非常重要。如果您使用 /p:DefineConstants 定义一个常量,您将丢失项目中所有其他已定义的常量。 DefineConstants 应该包含项目中需要的所有常量,你不能混合和匹配项目中定义的和使用 DefineConstants 定义的常量
【解决方案4】:

答案中所说的对C# 代码有效,也适用于 ASP.NET“代码隐藏”C# 代码。对于 ASP.NET Web 项目,如果您也想在 ASPX 页面中进行条件编译,那么在页面上条件渲染 HTML 的工作方式会有所不同(注意我已经删除了 MasterPageFile="..." AutoEventWireup="true" CodeBehind="..." Inherits="..."你通常在<%@ ... %> 声明中也有):

<%@ Page Title="MyPage" Language="C#" CompilerOptions="/d:DebugSym1;DebugSym2" %>

<% #if DebugSym1 %>         
    <h4>Section1</h4>
<% #else %>
    <h4>(Section 1 skipped)</h4>
<% #endif %>

<% #if DebugSym2 %>         
    <h4>Section2</h4>
<% #else %>
    <h4>(Section 2 skipped)</h4>
<% #endif %>

如果您从CompilerOptions 中删除DebugSym1DebugSym2,则会呈现相关#if 语句的#else 部分。

我认为这值得一提,因为该主题的完整性可以节省您的时间。如果您有兴趣,可以在article 中找到更多信息。

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 2010-12-31
    • 1970-01-01
    • 2012-05-29
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多