75

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

我目前在我的 buildscript 中有这条线:

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。

4

4 回答 4

141

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

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"
于 2009-01-26T15:40:39.300 回答
19

我不得不使用空格而不是分号,比如 Björn Lasar 的这篇文章:http ://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx

更新:博客消失了; 通过 Internet 存档检索

最近我不得不直接使用 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 的(分号分隔的)定义中。很高兴知道我认为...

于 2009-11-26T17:17:47.403 回答
5

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

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

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

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

于 2011-11-11T11:15:29.083 回答
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或,则呈现相关语句的部分。DebugSym2CompilerOptions#else#if

I thought this was worth mentioning for completeness of this topic and can save you time. More you can find in this article, if you're interested.

于 2013-06-17T12:02:27.833 回答