2012-05-23 2 views
18

So, beide this und this sind ziemlich klar. Einfach passieren /p:DefineConstants="SYMBOL"Wie übergeben Sie bedingte Kompilierungssymbole (DefineConstants) an Msbuild

Es funktioniert überhaupt nicht für mich, auch in einem Testprojekt. Ich erwarte, dass das Übergeben von/p: DefineConstants = "SYMBOL" alle bedingten Kompilierungskonstanten überschreibt, die im csproj definiert sind. Aber nicht der Fall ...

Vollcodeliste unten:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace DefineConstants 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
#if DEV 
      Console.WriteLine("DEV"); 
#elif UAT 
      Console.WriteLine("UAT"); 
#else 
      Console.WriteLine("No environment provided"); 
#endif 
     } 
    } 
} 

CSPROJ Datei ist:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform> 
    <ProductVersion>8.0.30703</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{57A2E870-0547-475C-B0EB-66CF9A2FE417}</ProjectGuid> 
    <OutputType>Exe</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>DefineConstants</RootNamespace> 
    <AssemblyName>DefineConstants</AssemblyName> 
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> 
    <FileAlignment>512</FileAlignment> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> 
    <PlatformTarget>x86</PlatformTarget> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\Debug\</OutputPath> 
    <DefineConstants>TRACE;DEBUG</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> 
    <PlatformTarget>x86</PlatformTarget> 
    <DebugType>pdbonly</DebugType> 
    <Optimize>true</Optimize> 
    <OutputPath>bin\Release\</OutputPath> 
    <DefineConstants>TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <ItemGroup> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="System.Xml.Linq" /> 
    <Reference Include="System.Data.DataSetExtensions" /> 
    <Reference Include="System.Data" /> 
    <Reference Include="System.Xml" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Compile Include="Program.cs" /> 
    <Compile Include="Properties\AssemblyInfo.cs" /> 
    </ItemGroup> 
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
    <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
     Other similar extension points exist, see Microsoft.Common.targets. 
    <Target Name="BeforeBuild"> 
    </Target> 
    <Target Name="AfterBuild"> 
    </Target> 
    --> 
</Project> 

gebaut mit:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild DefineConstants.sln /p:DefineConstants="DEV;DEBUG" /p:Configuration="Debug" /p:Platform="x86" 

Ausführen des Programms zeigt:

No environment provided 

Hilfe!

+0

Rechtsklick auf Lösung -> Clean Solution -> wiederholen Sie Ihren Build-Befehl. Könnte helfen. – Alex

+0

haben Sie versucht, mit Msbuild auf der Csproj-Datei anstelle der SLN? – KazR

Antwort

26

Mit DefineConstants funktioniert definitiv. Was bedeutet, dass Sie etwas falsch machen. Meine Vermutung ist, dass Sie zuerst das Projekt erstellt haben, ohne etwas zu definieren, und es dann erneut erstellt haben. MSBuild sieht dann, dass das Projekt bereits erstellt wurde und nicht erneut erstellt wird, sondern kopiert nur die Ausgabedateien. Sie sollten die Ausgabe von msbuild posten, damit wir sicher sein können, aber als Referenz ich Ihr Projekt mit den notwendigen Schalter kompiliert nur und hier ist das Ergebnis (Voll msbuild Ausgang weggelassen):

> msbuild ConsoleApplication1.sln /p:DefineConstants="DEV" /t:Rebuild 
.... 
Building solution configuration "Debug|x86". 
Project ... is building ConsoleApplication1.csproj" (Rebuild target(s)). 
... 
> ConsoleApplication1\bin\Debug\DefineConstants.exe 
DEV 
> msbuild ConsoleApplication1.sln /p:DefineConstants="UAT" /t:Rebuild 
... 
> ConsoleApplication1\bin\Debug\DefineConstants.exe 
UAT 
> msbuild ConsoleApplication1.sln /t:Rebuild 
... 
> ConsoleApplication1\bin\Debug\DefineConstants.exe 
No environment provided 
+5

/t: In der Tat neu erstellen. Guter Mann. –

+0

Ist irgendwo dokumentiert, dass Rebuild erforderlich ist, damit DefineConstants funktioniert, oder ist das nur ein gesunder Menschenverstand? Also gibt es keine Möglichkeit, inkrementelle Builds mit DefineConstants zu erstellen? – JohnZaj

+0

@jJack Hängt davon ab, was Sie mit * inkrementellen * meinen: Wenn Sie zuerst A.cs, dann Build, dann B.cs und Build bearbeiten, sollte es funktionieren. Obwohl ich mir nicht 100% ig sicher bin, dass Änderungen von DefineConstants vor dem Erstellen von B.cs immer noch Auswirkungen auf A.cs haben - Sie können es natürlich auch versuchen. – stijn

0

Es scheint Sie nicht vorbei bedingtes Kompilierungssymbol. Deshalb erhalten Sie Folgendes: Keine Umgebung. Gehe einfach zu den Projekteigenschaften und klicke dann auf den Build-Tab (linke Seite unterhalb der Anwendung). Sie werden eine Box finden, die nach dem bedingten Kompilierungssymbol fragt. Schreiben Sie einfach Ihre Konstanten nach Ihrer gewünschten Ausgabe. für Beispiel Um in Ihrem Beispiel "DEV" zu drucken, schreiben Sie DEV in die bedingte Kompilierungsbox und erstellen Sie Ihr Projekt neu. Ich bin sicher, es wird funktionieren.

Hinweis: Wenn Sie ein Symbol übergeben möchten, das nicht Ihrem Code entspricht, wird Folgendes gedruckt: Keine Umgebung ausgewählt.

+0

Seien Sie vorsichtig, wenn Sie eine alte Frage beantworten. Dieser ist über 5 Jahre alt und hat eine akzeptierte Antwort. Dieser fügt derzeit wenig zu nichts hinzu. - Von [Review] (https://stackoverflow.com/review) – Takarii

+0

Hallo, es ist wahr. Aber warum ich dieses ans anwende, könnte es anderen Leuten helfen, die nach derselben Frage suchen. –

Verwandte Themen