2012-05-23 8 views
18

Por lo tanto, tanto this como this son bastante claros. Simplemente pase /p:DefineConstants="SYMBOL"Cómo se transfieren los símbolos de compilación condicional (DefinirConstantes) a msbuild

No funciona en absoluto para mí, incluso en un proyecto de prueba. Estoy esperando que pasar/p: DefineConstants = "SYMBOL" anule cualquier constancia de compilación condicional definida en el csproj. Sin embargo no es el caso ...

código completo listado a continuación:

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

archivo .csproj es:

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

construyeron usando:

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

Ejecución del programa de muestra:

No environment provided 

¡Ayuda!

+0

Haga clic derecho en la solución -> Solución limpia -> vuelva a intentar su comando de compilación. Podría ayudar. – Alex

+0

¿Ha intentado utilizar msbuild en el archivo csproj en lugar de sln? – KazR

Respuesta

26

El uso de DefineConstants definitivamente funciona. Lo que significa que estás haciendo algo mal. Supongo que primero construiste el proyecto sin definir nada, y luego lo construiste de nuevo. MSBuild verá que el proyecto ya se creó y no volverá a compilarse, sino que solo copiará los archivos de salida. Usted debe enviar la salida de msbuild por lo que podemos estar seguros, pero para referencia compilé su proyecto utilizando los interruptores necesarios solamente y aquí está el resultado (salida msbuild completa omitido):

> 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: reconstruir de hecho. Buen hombre. –

+0

¿Está documentado en alguna parte que Rebuild es requerido para que DefineConstants funcione, o es solo sentido implícito? Entonces, ¿no hay forma de hacer compilaciones incrementales usando DefinirConstantes? – JohnZaj

+0

@jJack Depende de lo que quiera decir con * incremental *: si primero edita A.cs, luego Build, luego edita B.cs y Build again, debería funcionar. Aunque no estoy 100% seguro de que al cambiar DefineConstants antes de compilar B.cs todavía afectaría a A.cs, puedes probarlo, por supuesto. – stijn

0

Parece que no está de paso símbolo de compilación condicional. Es por eso que está obteniendo resultados como: Sin entorno proporcionado. Simplemente diríjase a las propiedades del proyecto y luego haga clic en la pestaña de compilación (lado izquierdo debajo de la aplicación). encontrará una caja pidiendo un símbolo de compilación condicional. Simplemente escriba sus constantes según su salida deseada. por ej. en su ejemplo, para imprimir "DEV" escriba DEV en el cuadro de compilación condicional y reconstruya su proyecto. estoy seguro de que funcionará

Nota: si desea pasar cualquier símbolo que no esté de acuerdo con su código, se imprimirá: Ningún entorno seleccionado.

+0

Tenga cuidado al responder una pregunta anterior. Este tiene más de 5 años y tiene una respuesta aceptada. Este actualmente agrega poco o nada extra. - De [Revisión] (https://stackoverflow.com/review) – Takarii

+0

Hola, es cierto. Pero por qué puse esta ans, podría ayudar a otras personas que buscan la misma pregunta. –

Cuestiones relacionadas