msbuild,定义条件编译符号


72

我可能只是盲目的,但是是否有命令行在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编译符号,但是我还没有看到msbuild的选项?

如果您知道我是否可以完全覆盖.csproj文件中已经指定的所有符号,以确保仅输入Buildscript中的条件,则可以使用Bonus Karma。


顺便说一句,这不是stackoverflow.com/questions/296147/…的副本,因为另一个问题具有相同的标题,但答案仅包括Visual Studio / Project File修改。
Michael Stum

Answers:


129

你看到吗?(大多数信息在倒数第二个帖子中)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"

5
添加了代码,就是这样,谢谢!它会覆盖.csproj文件中可能定义的所有常量,这也很好。
Michael Stum

5
为此,我不得不将其添加到命令行中:/ t:Rebuild
Dan W

从OS X终端使用xbuild我得到MSBUILD: error MSBUILD0005: Invalid syntax. Property name and value expected as <prop name>=[<prop value>]
Sanandrea '16

很棒。/ p:DefineConstants =“ QCBUILD”我的解决方案中有很多项目。这似乎是全球性的解决方案。有谁想指出我如何在使用Visual Studio(而非命令行)时获取解决方案全局条件编译符号?
user922020

2
请注意,这将替换现有的定义,因此,如果您依赖于定义的诸如NETCOREAPP或NETFRAMEWORK之类的内容,则会丢失这些内容。要附加到现有的定义,最好在.csproj文件中添加一个属性,例如:<DefineConstants>$(DefineConstants);FOO;BAR</DefineConstants>
rmunn

17

我必须使用空格而不是分号,这是BjörnLasar的这篇文章: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中的(以分号分隔)Defines中。很高兴知道我认为...


@Brody完成了。FWIW被接受的帖子(我赞成)可能会更加内gui,但潮流尚未
消除

您如何测试这些符号的存在?我试过了'$(SIGN_ASSEMBLY)'==''goto:exit,但是如果该符号不存在,则会得到相同的空字符串。
Quarkly

@MikeDoonsebury总是使用一个值及其特定值的存在,即== "True"-不确定msbuild中goto出口的含义-等同Condition于在<Task和/或任务调用上放置一个,例如<Exec Condtion="$(SignAssembly)=='True' ...
Ruben Bartelink

2

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

如果您只想关闭跟踪符号,则不能仅使用以下方法: msbuild /p:DefineTrace=false

您必须定义一些内容来覆盖所有已定义的符号: msbuild /p:DefineConstants="RANDOM-SYMBOL"

谢谢迈克尔·斯托姆(Michael Stum)指出了这个隐藏的规则, 我也为此写了一个博客---死链接


1
“所有符号”在这里真的很重要。如果使用/ p:DefineConstants定义常量,则将丢失项目中所有其他定义的常量。DefineConstants应该包含项目中需要的所有常量,您不能混合和匹配项目中定义的和使用DefineConstants定义的常量
Jitendra

1

答案中所说的内容对C#代码有效,对ASP.NET“代码隐藏” C#代码也有效。对于ASP.NET Web项目,如果您也想在ASPX页面中进行条件编译,则有条件地在页面上呈现HTML的方式有所不同(请注意,我也删除MasterPageFile="..." AutoEventWireup="true" CodeBehind="..." Inherits="..."<%@ ... %>声明中通常包含的HTML ):

<%@ 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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.