web-dev-qa-db-fra.com

Comment passez-vous les symboles de compilation conditionnels (DefineConstants) à msbuild

Donc, les deux ceci et ceci sont assez clairs. Il suffit de passer /p:DefineConstants="SYMBOL"

Cela ne fonctionne pas du tout pour moi, même dans un projet test. J'attends que le fait de passer/p: DefineConstants = "SYMBOL" écrase toutes les constantes de compilation conditionnelles définies dans csproj. Pas le cas cependant ...

Liste complète du code ci-dessous:

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

Le fichier .csproj est:

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

construit en utilisant:

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

L'exécution du programme montre:

No environment provided

Aide!

19
Steven P

Utiliser DefineConstants fonctionne vraiment. Ce qui signifie que vous faites quelque chose de mal. Je suppose que vous avez d’abord construit le projet sans définir quoi que ce soit, puis que vous l’ayez reconstruit. MSBuild verra alors que le projet a déjà été construit et ne le construira plus, mais copiera simplement les fichiers de sortie. Vous devriez poster la sortie de msbuild pour que nous puissions être sûrs, mais pour référence, j'ai compilé votre projet en utilisant uniquement les commutateurs nécessaires et voici le résultat (sortie complète de msbuild omise):

> 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

Il semble que vous ne passez pas le symbole de compilation conditionnelle. C'est pourquoi vous obtenez une sortie en tant que: Aucun environnement fourni. Il suffit d'aller dans les propriétés du projet et de cliquer sur l'onglet de construction (à gauche sous l'application). vous trouverez une boîte demandant un symbole de compilation conditionnelle. Il suffit d'écrire vos constantes selon votre sortie désirée. par ex. dans votre exemple, pour imprimer "DEV", écrivez DEV dans la boîte de compilation conditionnelle et reconstruisez votre projet. Je suis sûr que ça va marcher.

Remarque: si vous souhaitez passer un symbole autre que celui indiqué dans votre code, il sera imprimé: Aucun environnement sélectionné.

0
Sanket Raval