Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you pass conditional compilation symbols (DefineConstants) to msbuild

So, both this and this are pretty clear. Simply pass /p:DefineConstants="SYMBOL"

It doesn't work at all for me, even in a test project. I'm expecting that passing /p:DefineConstants="SYMBOL" will override any conditional compilation constants defined in the csproj. Not the case however...

Full code listing below:

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 file is:

<?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> 

built using:

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

Running the program shows:

No environment provided 

Help!

like image 251
Steven P Avatar asked May 23 '12 06:05

Steven P


1 Answers

Using DefineConstants definitely does work. Which means you are doing something wrong. My guess is you first built the project without defining anything, then built it again. MSBuild will then see the project was built already and won't build again, but just copy output files. You should post the output of msbuild so we can be sure, but for reference I compiled your project using the necessary switches only and here is the result (full msbuild output omitted):

> 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  
like image 123
stijn Avatar answered Sep 29 '22 03:09

stijn