2010-08-27 11 views
18

Mevcut çözümümüzü derleyen bir MSBuild betiğim var ancak projelerinden birinin içindeki bazı özelliklerini derleme zamanında derlemesini istiyorum, ancak bunlar AssemblyProduct ve AssemblyTitle dahil ancak bunlarla sınırlı değil. Ben derlenmektedir bir ana çalıştırılabilir ve çok sayıda dll varMSBuild'i kullanarak AssemblyProduct, AssemblyTitle'yi nasıl değiştirebilirim?

<Target Name="Compile" > 
<MSBuild Projects="..\MySolution.sln" 
      Properties="Configuration=MyReleaseConfig;Platform=x86" /> 
    </Target> 

:

İşte benim yapı komut snippet'idir bu. MSBuild Extension Pack'un farkındayım ve nasıl devam edeceğimi bilmeme rağmen, olmam gereken yere ulaşmam için bana yardımcı olabileceğinden şüpheliyim.

Yapım zamanında AssemblyInfo özelliklerini seçici olarak değiştirebilir miyim?

+0

, neden bunu yapmak isteyeyim? Gerçek dünya senaryosunu tanımakla ilgilenirim. –

+0

@RaheelKhan: Visual Studio dışındaki otomatik derleme komut dosyaları. Böyle bir komut dosyası belirli bir sürüm numarası belirler, bir derleme gerçekleştirir, bir yükleyici oluşturur ve isteğe bağlı olarak bitmiş yükleyiciyi (dosya adı ve sürüm numarası ile birlikte) dosyaya yükler. Aynı ürünün 12 çeşidini (her biri farklı bir ürün adıyla) her birkaç günde bir güncellerseniz, her biri için tek tıklamayla çözüm yolu vardır. Böyle bir betiğin çalıştırılmasının programcı olmayan biri tarafından yapılabileceğini düşünün. –

+0

Bu içgörü için teşekkür ederim. –

cevap

21

MSBuild Extension Pack ile doğru yoldasınız.

Ben koşullu yapı anda montaj detaylarını oluşturmanın en kolay yolu bulmak bir dosyaya AssemblyInfo güncellenen gerektiren benim .Csproj dosya (lar) bir "AssemblyVersion" hedefini doğrudan eklemektir. Hedefi, güncellenmiş bir AssemblyInfo dosyası gerektiren her csproj dosyasına doğrudan ekleyebilir ya da bunu yapmayı tercih ettiğim için, AssemblyVersion hedefi ile bir özel hedef dosyası oluşturabilir ve her csproj dosyasını özel hedefler dosyanıza ekleyebilirsin.

Her iki şekilde de ilgili AssemblyInfo görevlerini kullanmak için MSBuild Extension Pack'i veya MSBuild Community Tasks'u kullanmak isteyebilirsiniz.

İşte yapı komut bazı kod:

<!-- Import the AssemblyInfo task --> 
<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets"/> 

<!-- Overriding the Microsoft.CSharp.targets target dependency chain --> 
<!-- Call our custom AssemblyVersion target before build, even from VS --> 
<PropertyGroup> 
    <BuildDependsOn> 
     AssemblyVersion; 
     $(BuildDependsOn) 
    </BuildDependsOn> 
</PropertyGroup> 

<ItemGroup> 
    <AssemblyVersionFiles Include="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"/> 
</ItemGroup> 

<Target Name="AssemblyVersion" 
       Inputs="@(AssemblyVersionFiles)" 
       Outputs="UpdatedAssemblyVersionFiles"> 
    <Attrib Files="%(AssemblyVersionFiles.FullPath)" 
        Normal="true"/> 
    <AssemblyInfo 
     CodeLanguage="CS" 
     OutputFile="%(AssemblyVersionFiles.FullPath)" 
     AssemblyCompany="$(CompanyName)" 
     AssemblyCopyright="Copyright $(CompanyName), All rights reserved." 
     AssemblyVersion="$(Version)" 
     AssemblyFileVersion="$(Version)"> 
     <Output TaskParameter="OutputFile" 
         ItemName="UpdatedAssemblyVersionFiles"/> 
    </AssemblyInfo> 
</Target> 
+0

Hmmm .. bu * ne ihtiyacım var gibi görünüyor. Ben onu vermeye çalışacağım. –

+0

Teşekkürler! Oldukça güçlü, çalıştıktan sonra. –

+0

Hedef bağımlılık zincirinin dışa aktarılması VS'de bir miktar gürültü ekledi, her kurduğumda, güncellenmiş AssemblyInfo.cs dosyasını can sıkıcı bir şekilde yüklemek isteyip istemediğimi sorar. Bir geçici çözüm olarak, yerine 'kullandım. Beklendiği gibi, uyarılar VS'de kayboldu ve CLI'daki MSBuild hala değişiklikleri alıyor. Harika! – Hovis

18

Sneal cevabı çok yardımcı oldu, ama ben aslında bunu kadar sona erdi göstermek istiyorum. Csproj dosyalarını düzenlemek yerine (birkaç tane var) derleme komutlarıma görevler ekledim. İşte parçacık İşte:

<PropertyGroup> 
     <ProductName>MyApp</ProductName> 
     <CompanyName>MyCompany</CompanyName> 
     <Major>1</Major> 
     <Minor>0</Minor> 
     <Build>0</Build> 
     <Revision>0</Revision> 
    </PropertyGroup> 

    <ItemGroup> 
     <AssemblyVersionFiles Include="..\MyMainProject\Properties\AssemblyInfo.cs"/> 
    </ItemGroup> 

<Target Name="AssemblyVersionMAIN" Inputs="@(AssemblyVersionFiles)" Outputs="UpdatedAssemblyVersionFiles"> 
     <Attrib Files="%(AssemblyVersionFiles.FullPath)" Normal="true"/> 
     <AssemblyInfo 
      CodeLanguage="CS" 
      OutputFile="%(AssemblyVersionFiles.FullPath)" 
      AssemblyProduct="$(ProductName)" 
      AssemblyTitle="$(ProductName)" 
      AssemblyCompany="$(CompanyName)" 
      AssemblyCopyright="© $(CompanyName) 2010" 
      AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)" 
      AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" 
      AssemblyInformationalVersion="$(Major).$(Minor).$(Build).$(Revision)"> 
      <Output TaskParameter="OutputFile" ItemName="UpdatedAssemblyVersionFiles"/> 
     </AssemblyInfo> 
    </Target> 

<Target Name="Compile" DependsOnTargets="AssemblyVersionMAIN"> 
     <MSBuild Projects="..\MySolution.sln"  
       Properties="Configuration=Release;Platform=x86;Optimize=true" /> 
</Target> 

Sonra ben şöyle, komut satırı veya bir toplu komut dosyasından benim değişkenleri geçersiz kılabilir: meraktan

set MAJ=1 
set MIN=2 
set BLD=3 
set REV=4 

msbuild buildScript.xml /t:Compile /p:Major=%MAJ% /p:Minor=%MIN% /p:Build=%BLD% /p:Revision=%REV% 
+0

Çok ilginç ... komut satırı yapısı sayesinde teşekkürler ben de çalışıyorum. – DRapp

İlgili konular