2013-04-10 11 views
8

Şu anda yalnızca x86 için oluşturduğumuz 2 farklı SKU'nun A ve B'si olan bir VS2012 .NET 4 ürünümüz var. Ayrıca, şu anda 4 yapılandırmaya sahip olacağımız olağan Konfigürasyon Debug ve Release var.Aynı anda x86 ve x64 için bir VS2012 çözümü nasıl yapılandırılır

  • DebugA
  • DebugB
  • .csproj birine bakıyor ReleaseA
  • ReleaseB

dosyaları o Açıkçası bu

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugA|x86' "> 
    <OutputPath>..\bin\DebugA\</OutputPath> 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseA|x86' "> 
    <OutputPath>..\bin\ReleaseA\</OutputPath> 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugB|x86' "> 
    <OutputPath>..\bin\DebugB\</OutputPath> 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseB|x86' "> 
    <OutputPath>..\bin\ReleaseB\</OutputPath> 
</PropertyGroup> 

katına çıkacak x64 ekleyerek gibi görünür bu 4 ila 8 farklı kombinasyon, ve VS de istediği zaman AnyCPU platform yapılandırmaları ekliyor gibi görünüyor. Tüm 8'in 30'dan fazla projede doğru bir şekilde yapılandırılmasının VS'de çok fazla tıklama yapılmasını sağlaması ve hata yapmak gerçekten çok kolay.

Birden çok hedefleme sorununun çözüldüğü birkaç başka SO sorusu okudum ve referans yolunda $ {Platform} kullanılarak ilgili farklı platformlar için farklı referansların dahil edilmesinin önerilerinden biri. Benim proje yapılandırma için benzer bir şey yapabileceğini düşündüm, bu yüzden çoklu platform yapmaya çalışırken bu çalıştı:

<PropertyGroup Condition=" '$(Configuration)' == 'DebugA' Or '$(Configuration)' == 'DebugB' "> 
    <OutputPath>..\bin\${Platform}\${Configuration}\</OutputPath> 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)' == 'ReleaseA' Or '$(Configuration)' == 'ReleaseB' "> 
    <OutputPath>..\bin\${Platform}\${Configuration}\</OutputPath> 
</PropertyGroup> 
hangisi, teoride, ben sadece iki ile tüm 8 farklı kombinasyonlar için gerekenleri bana vermelidir

blokları. Ancak VS'ye baktığımda, neitehr x86 ya da x64'ü proje için mevcut platformlar olarak göremiyorum. VS gerçekte yapı platformlarını depolamanın tek yolunun onları özellik grupları üzerindeki çılgın koşullar olarak kodlayarak mı göründüğü? Öyle diyelim ki ...

VS ile iyi çalışacak "güzel" görünümlü çoklu platform .csproj yapmanın bir yolu yok mu?

.csprojs dosyasını oluşturabilir ve sonra VS'de düzenleyememeye karar verebilirim, çünkü VS tek tek projelerin özellik pencerelerinde herhangi bir platform gösteremese de, msbuild doğru platformları kullanacak mı?

Düzenleme: queston biraz kafa karıştırıcı gibi görünüyor

: Açık olmak gerekirse, ben, nasıl kurulacağı biliyorum korumak ve projelerin yapılandırmasını Genel görünüme istiyorum ve benim çözümün yapı yapılandırması, çok sayıda proje ve config | platformun sekiz kombinasyonu olduğunda. Bunu elle nasıl yapacağımı biliyorum, ancak fikrimi kaybetmeden veya 200+ özellik sayfasından birinde hata yapmadan.

+0

"Ayarlama, sürdürme ve genel bakış" dan ne istediğinizi ve bugün zorlayıcı bulduğunuz şeyleri netleştirmeniz gerektiğini düşünüyorum. –

+0

Bir yapılandırma (birleşim, platform, proje) özelliklerinin bir yavaş yükleme iletişim sayfasında ayarlanır. Bu genellikle 100+ kombinasyonlu bir matris olduğundan, bu sıkıcı ve hataya yatkındır. Yapılandırmayı etkin bir şekilde tutabilmek için TÜM konfigürasyonları tek bir matriste görmem gerekiyor ya da yapılandırılmış kombinasyonların sayısını sınırlamak için örnekte olduğu gibi değişkenleri kullanmanın bir yoluna ihtiyacım var. –

cevap

0

Çalıştırmak istediğiniz farklı yapıları seçebileceğiniz toplu yapıyı istiyorsunuz.

enter image description here

Sen Araçları ile bir klavye kısayolu için bu eşleyebilirler -> Seçenekler -> Klavye o zaman yapılandırma adlarında platformları ve SKU'larının birleştirmek akılsızca Build.BatchBuild

için Bence
+0

Sadece * çalışan * çoklu (farklı) yapılar için bu işlev değil mi? Benim sorum, tekrarlı ve hataya eğilimli bir çalışma yapmak zorunda kalmadan, büyük bir yapı matrisinin nasıl kurulacağını ve korunacağını açıklamaktır. Toplu yapılandırma, 8 yapılandırma/platform kombinasyonları ile büyük bir çözüm için sln ve csproj dosyalarını kurmama yardımcı olacak ve bana yardımcı olacak mı? –

0

arayın. Durumunuzda, yalnızca Hata Ayıklama ve Sürüm proje yapılandırmaları ile yapıştırmanızı öneririz. Çözümünüzün SKU A için bir proje ve SKU B için ayrı bir proje olmalıdır (ortak dosyaları paylaşma). Her proje, daha sonra iki yapı yapılandırmasına ek olarak x86 ve x64 platformlarını hedefleyebilir.Daha sonra, bireysel proje yapılandırmalarını daha karmaşık hale getirmeden yönetmek istediğiniz kadar çok çözüm yapılandırması ekleyebilirsiniz.

+0

SKU: s, onları ayıran birkaç derleme sembolüyle% 98 eşit kodludur ve binlerce proje ile 30 proje vardır. Yani SKU'ları ayırmak için onu kopyalamak pratik değil. Örneğini derleyen birçok büyük kütüphaneyle nasıl çalıştığını karşılaştırın. #if SILVERLIGHT kullanarak yaygın olarak yapılandırmalarda Silverlight/Desktop/Winphone için. –

+1

Açık olmak gerekirse, platformlar platformlardır. "x86" ve "x64" ve genellikle yapılandırmalar, framework: silverlight/desktop/phone, sku: pro/lite, buildtype: debug/release vb. gibi her şeyi kontrol etmek zorundadır. –

+0

Ne demek istediğini anlıyorum. Birden fazla proje, çözümünüzü organize etmenin en etkili yoludur, ancak farklı bir yaklaşım izlemek için bir nedeniniz olduğu anlamına gelir. –

2

Proje dosyalarını bir kez manuel olarak değiştirmek zorunda kalmazsanız, tüm paylaşılan yapılandırmayı bir yapılandırma dosyasına koyabilirsiniz ve her bir projeden başvuruda bulunabilirsiniz. Bunu yapmak için önce yapılandırma dosyanızı oluşturmanız gerekir. Bu dosya, tüm projeler arasında paylaşmak istediğiniz tüm bilgileri (yapı yapılandırmaları gibi) içeren normal bir MsBuild dosyasıdır. Dosya Bu gibi yaklaşık olacaktır:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5" 
     DefaultTargets="Build" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <!-- VS information --> 
     <ProductVersion>9.0.30729</ProductVersion> 
     <SchemaVersion>2.0</SchemaVersion> 

     <!-- Default configuration --> 
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> 
     <FileAlignment>512</FileAlignment> 

     <!-- Project directories --> 
     <AppDesignerFolder>Properties</AppDesignerFolder> 
     <OutputPath>$(SolutionDir)\..\build\bin\$(Platform)\$(Configuration)\</OutputPath> 
     <IntermediateOutputPath>$(SolutionDir)\..\build\temp\bin\obj\$(AssemblyName)\$(Platform)\$(Configuration)\</IntermediateOutputPath> 

     <!-- Build configuration --> 
     <ErrorReport>prompt</ErrorReport> 
     <WarningLevel>4</WarningLevel> 
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
     <DebugSymbols>true</DebugSymbols> 
     <DebugType>full</DebugType> 
     <Optimize>false</Optimize> 
     <DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
     <DebugType>pdbonly</DebugType> 
     <Optimize>true</Optimize> 
     <DefineConstants>TRACE;CODE_ANALYSIS</DefineConstants> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> 
     <DebugSymbols>true</DebugSymbols> 
     <DebugType>full</DebugType> 
     <Optimize>false</Optimize> 
     <DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> 
     <DebugType>pdbonly</DebugType> 
     <Optimize>true</Optimize> 
     <DefineConstants>TRACE;CODE_ANALYSIS</DefineConstants> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' "> 
     <DebugSymbols>true</DebugSymbols> 
     <DebugType>full</DebugType> 
     <Optimize>false</Optimize> 
     <DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' "> 
     <DebugType>pdbonly</DebugType> 
     <Optimize>true</Optimize> 
     <DefineConstants>TRACE;CODE_ANALYSIS</DefineConstants> 
    </PropertyGroup> 
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
</Project> 
  • ilk PropertyGroup tüm tüm projeler tarafından kullanılan sabit yapılandırmaları oluşturmak, yani genel sabitleri tanımlar. Eğer OutputPath için görebileceğiniz gibi ikili vs vs
  • ilk PropertyGroup da ayarlarının bir demet normalde görsel stüdyo tarafından tanımlamıştır, örneğin konumunu belirlemek için $(Platform) ve $(Configuration) gibi değişkenleri oluşturmak kullanabilirsiniz ProductVersion. Teknik olarak bunları taşımak zorunda değilsiniz, ancak bunları taşırken proje dosyalarınızdaki karmaşayı azaltır.
  • Aşağıdaki bölümlerde farklı yapı yapılandırmaları için farklı ayarlar tanımlanmıştır.

Yapılandırma dosyasını tanımladıktan sonra, buna BaseConfigurations.targets adını verin, sonra proje dosyalarınızı düzenlemeniz gerekir. Ne yazık ki tüm proje dosyalarını gözden geçirmelisiniz, ancak bunu sadece bir kez yapmanız gerekecektir. Konfigürasyon dosyasına bağlandıktan sonra konfigürasyon dosyasını değiştirerek tüm paylaşımlı konfigürasyonları değiştirebilirsiniz.

Normal bir proje dosyası aşağıdaki gibi kabaca görünecektir:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProjectGuid>{33017F71-5A1C-4113-9041-4DD3F58921D0}</ProjectGuid> 
    <OutputType>Library</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>MyProject</RootNamespace> 
    <AssemblyName>MyProject</AssemblyName> 
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> 
    <FileAlignment>512</FileAlignment> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\Debug\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <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="Microsoft.CSharp" /> 
    <Reference Include="System.Data" /> 
    <Reference Include="System.Xml" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Compile Include="Class1.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> 

size gerekecektir yapılandırma dosyasını bağlamak için: zaten tanımlanmıştır ilk PropertyGroup kaldır

  • yapılandırma dosyanızın
  • <SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir> hattını ekleyin. Visual Studio'dan (Visual Studio'nun otomatik olarak SolutionDir değişkenini tanımladığı için) oluşturuyorsanız, bu gerekli değildir, ancak projenizi MsBuild aracılığıyla oluşturmak istiyorsanız bu gereklidir. Sadece ilk PropertyGroup altında

    source 
        MyProject 
         MyProject.csproj 
        MySolution.sln 
    
  • aşağıdaki satırı ekleyin: Bu hat aynı zamanda her Proje kendi alt dizininde olduğunu ve çözüm dosyası, her proje dosyasından bir dizin yukarı olduğunu varsayar yani senin yapısı gibi bir şey olduğunu <Import Project="$(SolutionDir)\BaseConfiguration.targets" />. Bu yapılandırma dosyasını almak istediğiniz MsBuild (ve dolayısıyla Visual Studio) gösterir.

  • Yapılandırma yapılandırmalarını kaldırın
  • Dosya sonunda <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> hattını kaldırın. Bu, yapılandırma dosyanızda tanımlanmıştır ve artık gerekli değildir.

tüm bu proje dosyası gibi görünmelidir sonra: Bu yaklaşım Visual Studio sizi tüm farklı yapı yapılandırmaları tanır ve izin vermelidir izlerseniz

  • :

    <?xml version="1.0" encoding="utf-8"?> 
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
        <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 
        <PropertyGroup> 
        <SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir> 
        <ProjectGuid>{33017F71-5A1C-4113-9041-4DD3F58921D0}</ProjectGuid> 
        <OutputType>Library</OutputType> 
        <RootNamespace>MyProject</RootNamespace> 
        <AssemblyName>MyProject</AssemblyName> 
        </PropertyGroup> 
        <Import Project="$(SolutionDir)\BaseConfiguration.targets" /> 
        <ItemGroup> 
        <Reference Include="System" /> 
        <Reference Include="System.Core" /> 
        <Reference Include="System.Xml.Linq" /> 
        <Reference Include="System.Data.DataSetExtensions" /> 
        <Reference Include="Microsoft.CSharp" /> 
        <Reference Include="System.Data" /> 
        <Reference Include="System.Xml" /> 
        </ItemGroup> 
        <ItemGroup> 
        <Compile Include="Class1.cs" /> 
        <Compile Include="Properties\AssemblyInfo.cs" /> 
        </ItemGroup> 
        <!-- 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> 
    

    Notlar Doğru olanı seç. Projeleri belirli bir çözüm yapılandırmasından dahil etmek ya da hariç tutmak için çözüm için 'Configuration Manager' bölümüne gitmeniz gerekebileceğini unutmayın.

  • Bu yaklaşımı uygularsanız, global olarak tanımlanmış özelliklerden herhangi birinin bir proje için özellik sayfası aracılığıyla değiştirilmesi mümkün değildir. Yapılandırma dosyasında değişiklik yapmanız gerekecektir, bu da her bir projenin özelliklerine yansıtılacaktır.
  • Visual Studio 2010 veya daha önceki bir sürümünü kullanıyorsanız, yapılandırma dosyasında değişiklikler yaparsanız, Visual Studio 2010 dosyaları içerecek değişiklikleri algılayamayacağından çözümü yeniden yüklemeniz gerekir (açıksa). Visual Studio 2012, dosyaları içerecek değişiklikleri tespit edebilmelidir.
İlgili konular