webentwicklung-frage-antwort-db.com.de

Wie übergeben Sie bedingte Kompilierungssymbole (DefineConstants) an msbuild?

Also sind beide das und dieses ziemlich klar. Einfach /p:DefineConstants="SYMBOL" übergeben

Es funktioniert überhaupt nicht für mich, selbst in einem Testprojekt. Ich erwarte, dass das Übergeben von/p: DefineConstants = "SYMBOL" alle in csproj definierten bedingten Kompilierungskonstanten überschreibt. Nicht der Fall aber ...

Vollständige Code-Liste 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"

Das Ausführen des Programms zeigt:

No environment provided

Hilfe!

19
Steven P

Die Verwendung von DefineConstants funktioniert definitiv. Was bedeutet, dass Sie etwas falsch machen. Meine Vermutung ist, dass Sie das Projekt zuerst erstellt haben, ohne etwas zu definieren, und dann erneut erstellt haben. MSBuild sieht dann, dass das Projekt bereits erstellt wurde und baut es nicht erneut auf, sondern kopiert nur die Ausgabedateien. Sie sollten die Ausgabe von msbuild posten, damit wir sicher sein können, aber als Referenz habe ich Ihr Projekt nur mit den erforderlichen Schaltern kompiliert. Hier ist das Ergebnis (vollständige msbuild-Ausgabe wird 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 
29
stijn

Es scheint, dass Sie kein bedingtes Kompilierungssymbol übergeben. Aus diesem Grund erhalten Sie folgende Ausgabe: Keine Umgebung. Gehen Sie einfach zu den Projekteigenschaften und klicken Sie dann auf die Build-Registerkarte (links unter der Anwendung). In einem Feld werden Sie nach einem bedingten Kompilierungssymbol gefragt. Schreiben Sie einfach Ihre Konstanten entsprechend Ihrer gewünschten Ausgabe. zum Beispiel Um in Ihrem Beispiel "DEV" zu drucken, schreiben Sie DEV im Feld für die bedingte Kompilierung und erstellen Sie Ihr Projekt neu. Ich bin mir sicher, dass es funktionieren wird.

Hinweis: Wenn Sie ein beliebiges Symbol übergeben möchten, wird gemäß dem Code Folgendes gedruckt: Keine Umgebung ausgewählt.

0
Sanket Raval