msbuild, определение условных символов компиляции - PullRequest
60 голосов
/ 26 января 2009

Возможно, я просто слепой, но есть ли командная строка для указания символов условной компиляции в 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?

Бонус Карма, если вы знаете, могу ли я полностью переопределить все символы, уже указанные в файлах .csproj, чтобы убедиться, что в него входят только условные выражения из моего Buildscript.

Ответы [ 4 ]

122 голосов
/ 26 января 2009

Вы видели это ? (большая часть информации находится в предпоследнем сообщении)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"
15 голосов
/ 26 ноября 2009

Мне пришлось использовать пробел вместо точки с запятой а-ля Björn Lasar: http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx

Обновление: блог исчез; получено через Интернет-архив :

Недавно мне пришлось использовать MSBuild напрямую для автоматизации некоторых сборок. Я также должен был настроить некоторые определения препроцессора на основе конфигурации. Обычно это делается с помощью аргумента, подобного этому

"/p:DefineConstants=MY_PREPROC_FLAG"

Здесь нет ничего особенного, поскольку в Интернете достаточно комментариев по этому поводу. Сегодня мне понадобился еще один флаг, и я использовал синтаксис командной строки, подобный тому, как я знал его из IDE:

"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG"

но этот не сработал.

Итак, суть в том, что если вы хотите поддерживать множественные определения для проекта с помощью командной строки, вам придется разделить их простыми пробелами ...

"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG" 

, и он будет добавлен к (Определению, разделенному точкой с запятой) из IDE. Приятно знать, я думаю ...

1 голос
/ 17 июня 2013

То, что сказано в ответах, действительно для кода C#, а также для ASP.NET "codebehind" C # кода. Для веб-проектов ASP.NET , если вы хотите также выполнить условную компиляцию на страницах 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.

Я подумал, что это стоит упомянуть для полноты этой темы и может сэкономить ваше время. Больше вы можете найти в этой статье , если вам интересно.

1 голос
/ 11 ноября 2011

/p:DefineConstants - сделка "все или ничего".

Если вы просто хотите отключить символ трассировки, вы не можете просто сделать это с помощью: msbuild /p:DefineTrace=false

Вы должны определить что-то, чтобы переопределить все уже определенные символы: msbuild /p:DefineConstants="RANDOM-SYMBOL"

Спасибо, Майкл Стум, указал на это скрытое правило. Я также написал блог об этом --- мертвая ссылка

...