在 MSBuild 中定义条件编译符号

问题描述 投票:0回答:4

我可能只是瞎了,但是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 PropertiesBuildConditional Compilation Symbols,但我还没有看到 MSBuild 的该选项。

如果您知道我是否可以完全覆盖 .csproj 文件中已指定的所有符号,以确保只有我的构建脚本中的条件进入,那就奖励 Karma。

.net msbuild compiler-options
4个回答
156
投票

你见过这个吗? (大部分信息在倒数第二篇文章中)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"

22
投票

我必须使用空格而不是分号,如 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 的(分号分隔的)定义中。 很高兴知道我认为...


6
投票

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

如果你只是想关闭跟踪符号,你不能只用:

msbuild /p:DefineTrace=false

您必须定义一些东西来覆盖所有已定义的符号:

msbuild /p:DefineConstants="RANDOM-SYMBOL"

感谢 Michael Stum 指出这个隐藏的排除 我还写了一篇关于它的博客 --- 死链接


1
投票

答案中的内容适用于

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
部分。

我认为为了本主题的完整性,这一点值得一提,并且可以节省您的时间。如果您有兴趣,可以在这篇文章中找到更多内容。

© www.soinside.com 2019 - 2024. All rights reserved.