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.

4 ответа

Решение

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

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"

Я должен был использовать пробел вместо точки с запятой а-ля 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. Приятно знать, я думаю...

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

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

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

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

То, что сказано в ответах, действительно для 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 Заявление представляется.

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

Другие вопросы по тегам