2012-05-23 23 views
18

'a nasıl iletirsiniz? Böylece, hem this hem de this oldukça açıktır. Sadece bir test projesinde bile, benim için işe yaramazsa, /p:DefineConstants="SYMBOL"Koşullu derleme sembollerini (DefineConstants) msbuild

. Bu geçişi bekliyorum/p: DefineConstants = "SYMBOL" csproj içinde tanımlanan herhangi bir koşullu derleme sabitlerini geçersiz kılacaktır. Ancak Durumda ...

Tam kod aşağıda listesi :

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 dosyasıdır:

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

inşa kullanarak:

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

gösterir programının çalıştırılması:

No environment provided 

Yardım!

+0

Çözüme sağ tıklayın -> Temiz Çözüm -> derleme komutunuzu yeniden deneyin. Yardımcı olabilir. – Alex

+0

sld yerine csproj dosyasında msbuild kullanmayı denediniz mi? – KazR

cevap

26

DefineConstants kullanımı kesinlikle işe yarıyor. Yani yanlış bir şey yapıyorsun demektir. Tahminimce önce projeyi bir şey tanımlamadan inşa ettiniz, sonra tekrar inşa ettiniz. MSBuild daha sonra projenin zaten oluşturulduğunu görecek ve yeniden oluşturmayacak, ancak sadece çıktı dosyalarını kopyalayacak. emin olabiliriz böylece msbuild çıktısını gönderilmesi gerekiyor, ama başvuru için sadece ve burada sonucudur gerekli anahtarlarını kullanarak projenizi derlenmiş (tam Msbuild çıkışı atlanmıştır):

> 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: Gerçekten yeniden oluşturun. İyi adam. –

+0

DefineConstant'ların çalışması için Rebuild'in gerekli olduğu bir yerde belgelenmiş mi, yoksa bu sadece sağduyu mu? Yani DefineConstants kullanarak artımlı yapıları yapmak için bir yolu yoktur? – JohnZaj

+0

@jJack * incremental * ile ne kastettiğinize bağlı olarak değişir: önce A.cs'i düzenlerseniz, sonra Build (Oluştur), daha sonra B.cs ve Build'i tekrar düzenlerseniz, çalışması gerekir. Her ne kadar, B.cr'leri oluşturmadan önce DefineConstantlarını değiştirirken, A.cs'i hala etkileyeceğinden% 100 emin değilim. – stijn

0

Size geçmezken görünüyor koşullu derleme simgesi. Bu yüzden çıktı alıyorsunuz: Çevre sağlanmadı. Sadece proje özelliklerine gidin ve oluştur sekmesine tıklayın (uygulamanın altındaki sol taraf). Koşullu derleme sembolü isteyen bir kutu bulacaksınız. Sadece sabitlerinizi istediğiniz çıktıya göre yazınız. örneğin Örneğinizde, "DEV" yazımını koşullu derleme kutusuna yazıp projenizi yeniden oluşturun. Eminim işe yarayacak.

Not: Kodunuza göre herhangi bir sembolü geçmek istiyorsanız, yazdıracaktır: Ortam seçilmedi.

+0

Eski bir soruya cevap verirken dikkatli olun. Bu 5 yaşın üzerindedir ve kabul edilmiş bir cevabı vardır. Bu şu anda ekstra bir şey için çok az ekler. - [İnceleme] 'den (https://stackoverflow.com/review) – Takarii

+0

Merhaba, doğru. Ama neden bu ans'ı koydum, aynı soruyu arayan diğer insanlara yardımcı olabilir. –