我可能只是瞎了,但是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 中,我可以进入 Project Properties → Build → Conditional Compilation Symbols,但我还没有看到 MSBuild 的该选项。
如果您知道我是否可以完全覆盖 .csproj 文件中已指定的所有符号,以确保只有我的构建脚本中的条件进入,那就奖励 Karma。
你见过这个吗? (大部分信息在倒数第二篇文章中)
/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"
我必须使用空格而不是分号,如 Björn Lasar 的这篇文章:http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx
更新:博客已消失; 通过互联网档案馆检索:
最近我不得不直接使用 MSBuild 来自动化一些构建。我还必须根据配置配置一些预处理器定义。这通常是通过这样的参数来完成的
"/p:DefineConstants=MY_PREPROC_FLAG"
这里没什么特别的,因为网上有足够多的评论。今天,我还需要一个 Flag,我使用的命令行语法与我从 IDE 中了解到的类似:
"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG"
但是这个没用。
所以重点是,如果您想通过命令行支持项目的多个定义,您必须用简单的空格分隔它们......
"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG"
它将被添加到 IDE 的(分号分隔的)定义中。 很高兴知道我认为...
/p:DefineConstants
是一个全有或全无的交易。
如果你只是想关闭跟踪符号,你不能只用:
msbuild /p:DefineTrace=false
您必须定义一些东西来覆盖所有已定义的符号:
msbuild /p:DefineConstants="RANDOM-SYMBOL"
感谢 Michael Stum 指出这个隐藏的排除 我还写了一篇关于它的博客 --- 死链接
答案中的内容适用于
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 %>
如果从
DebugSym1
中删除 DebugSym2
或 CompilerOptions
,则会呈现相关 #else
语句的 #if
部分。
我认为为了本主题的完整性,这一点值得一提,并且可以节省您的时间。如果您有兴趣,可以在这篇文章中找到更多内容。