我可能只是失明,但在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中,我可以进入Project Properties => Build =>条件编译符号,但我还没有看到msbuild的选项?
Bonus Karma如果你知道我是否可以完全覆盖.csproj文件中已经指定的所有符号,以确保只有我的Buildscript中的条件进入。
答案 0 :(得分:121)
你见过this吗? (大部分信息都在倒数第二篇帖子中)
/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"
答案 1 :(得分:15)
我不得不在BjörnLasar的这篇文章中使用空格而不是分号:http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx
更新:博客已消失; retrieved via Internet Archive:
最近我不得不直接使用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中的(以分号分隔的)Defines。 很高兴知道我认为......
答案 2 :(得分:1)
/p:DefineConstants
是全有或全无的交易。
如果您只想关闭跟踪符号,则不能只执行以下操作:msbuild /p:DefineTrace=false
您必须定义一些内容以覆盖已定义的所有符号:msbuild /p:DefineConstants="RANDOM-SYMBOL"
感谢Michael Stum指出这个隐藏的规则 I have also wrote a blog about it --- dead link
答案 3 :(得分:1)
答案中的内容对C#
代码有效,对ASP.NET“代码隐藏”C#代码也有效。对于 ASP.NET Web项目,如果您也希望在ASPX页面中进行条件编译,则在页面上有条件地呈现HTML会有所不同(请注意我已删除{{1}你通常在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
部分。
我认为这对于这个主题的完整性值得一提,可以节省您的时间。如果您有兴趣,可以在article找到更多内容。