Подтвердить что ты не робот

Msbuild, определяющий условные символы компиляции

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

4b9b3361

Ответ 1

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

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"

Ответ 2

Мне пришлось использовать пробел вместо точки с запятой a la this post by 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. Полезно знать, я думаю...

Ответ 3

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

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

Ответ 4

/p:DefineConstants - это все или ничего.

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

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

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