0

У нас есть веб-приложение C#, которое публикуется с использованием сценария Powershell. В нашем коде C# мы имеем несколько мест, где мы проверяем #if DEBUG, чтобы условно скомпилировать приложение с дополнительной поддержкой для ведения журнала.Как предотвратить постоянный препроцессор DEBUG от # DEFINE'd автоматически при публикации из msbuild.exe

Проблема постоянной DEBUG определяется, когда мы помещаем из командной строки с помощью следующей команды:

cmd /c "path\to\msbuild.exe path\to\project.csproj /p:DeployOnBuild=true;PublishProfile=Development /verbosity:minimal" 

Мы создали «Развитие» построить конфигурацию, чтобы соответствовать нашей общей среде разработки, а затем в Визуальном Студия через GUI устанавливает конфигурацию сборки «Разработка» при создании профиля публикации.

Как предотвратить автоматическое определение константы препроцессора DEBUG?

Должно быть, мне не хватает чего-то простого.

+2

Укажите, какую конфигурацию вы хотите построить. Сейчас вы построите все из них, некоторые с неправильным свойством DeployOnBuild, которое может объяснить, почему определено DEBUG. Должна напоминать/p: Конфигурация = Разработка. Должно быть, легко видно из вывода msbuild btw, убедитесь, что вам нужно лететь слепой. Использование «cmd.exe/c» имеет умение слишком быстро закрыть окно консоли,/k поддерживает его. –

+0

@HansPassant: Таким образом, указание «PublishProfile = Development» не выбирает конфигурацию сборки, которую мы выбираем для этого профиля публикации в Visual Studio? -Это делает Web.config правильно преобразовывается. - О! Он преобразует Web.config с помощью Web.Debug.config! –

+0

@HansPassant: задано задание конфигурации сборки. Если вы опубликуете это как ответ, я дам ему +1 и отметьте его как ответ. :) Благодаря! –

ответ

1

Вы должны указать установить свойство конфигурации для развития

/р: Конфигурация = Развитие

cmd /c "path\to\msbuild.exe path\to\project.csproj /p:Configuration=Development/p:DeployOnBuild=true;PublishProfile=Development /verbosity:minimal" 

По умолчанию Visual Studio создает проекты с двумя конфигурациями:

Debug : Этот должен использоваться для разработки, он включает константу DEBUG по умолчанию. Релиз: Этот должен использоваться для производства

Вы также можете создавать пользовательские конфигурации с нуля или на основе Debug/Release, если вы создали пользовательскую конфигурацию «Разработка» в Debug, она будет включать константу DEBUG, вы можете удалите его вручную из файла .csproj или щелкните правой кнопкой мыши проект и просмотрите свойства проекта.

Не путайте свойство «Конфигурация» с PublishProfile, PublishProfile предназначен для создания пакета Deployment после компиляции, вы можете использовать PublishProfile, объединяющий его с Debug или Release.

Если вы используете преобразования web.config, обязательно обновите «Release» или настраиваемое преобразование конфигурации на основе ваших потребностей.

+0

Несмотря на то, что по умолчанию создаются две конфигурации сборки, мы создали * другую конфигурацию сборки: Development. Ваш ответ правильный, за исключением того, что конфигурация сборки должна быть «Разработка» в моем случае. Кроме того, вы можете снять флажок «Define DEBUG» в свойствах проекта и не будет определять эту константу. –

+0

@GregBurghardt все, что вы сказали, верно, и я упомянул все это в своем ответе в общем виде, когда говорю «пользовательскую конфигурацию» или когда я упоминал «прямо щелкните проект и просмотрите свойства проекта». ** Ответ на ваш конкретный вопрос находится в первой строке, а в примере второй - **, остальная часть - некоторая вспомогательная информация. Правильно ли ответ на ваш вопрос или нет? – Rolo

+0

Я отредактировал ваш ответ, чтобы быть конкретным для моего вопроса, который действительно включал в себя изменение параметра '/ p: Configuration' в« Development », поскольку это напрямую применимо к моей проблеме. +1 и отмечен как ответ. Благодаря! –

0

код, который говорит MSBuild к «автомагически» определить константу DEBUG можно найти в файле .csproj в DefineConstants элемента конфигурации сборки (см следующий отрывок из одного из моих .csproj файлов):

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> 
    <PlatformTarget>x86</PlatformTarget> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\Debug\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
</PropertyGroup> 

Вам нужно будет использовать конфигурацию сборки, которая не содержит ее.