2010-08-27 13 views
18

Ho uno script MSBuild che compila la mia soluzione esistente ma vorrei modificare alcune proprietà di uno dei progetti entro la soluzione in fase di compilazione, inclusi, ma non limitati a AssemblyProduct e AssemblyTitle.Come posso cambiare AssemblyProduct, AssemblyTitle usando MSBuild?

Ecco un frammento del mio script di build:

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

Ho uno principali DLL eseguibili e diversi che vengono compilati. Sono a conoscenza dello MSBuild Extension Pack e ho il sospetto che potrebbe aiutarmi ad arrivare dove devo essere, anche se non sono sicuro di come procedere.

Posso modificare selettivamente le proprietà AssemblyInfo al momento della compilazione?

+0

Per curiosità, perché si vuole farlo? Sarei interessato a conoscere uno scenario del mondo reale. –

+0

@RaheelKhan: script di compilazione automatici esterni a Visual Studio. Tale script imposta un numero di versione specifico, esegue una compilazione, genera un programma di installazione e, facoltativamente, carica il programma di installazione completato (completo del nome del prodotto e del numero di versione nel nome file) su Internet. Se hai 12 varianti dello stesso prodotto (ciascuna con un nome di prodotto diverso) che aggiorni ogni pochi giorni, avere una soluzione con un clic per ciascuna è la strada da percorrere. Considera anche che l'esecuzione di tale script può essere eseguita da qualcuno che non è un programmatore. –

+0

Grazie per l'intuizione. –

risposta

21

Sei sulla strada giusta con MSBuild Extension Pack.

trovo il modo più semplice per generare condizionalmente i dettagli di montaggio in fase di compilazione è quello di aggiungere un "AssemblyVersion" target direttamente alla mia Csproj file (s), che richiedono un aggiornamento AssemblyInfo file. È possibile aggiungere il target direttamente a ciascun file csproj che richiede un file AssemblyInfo aggiornato oppure, come preferisco farlo, creare un file target personalizzato con il target AssemblyVersion e fare in modo che ogni file csproj includa il proprio file target personalizzato.

In entrambi i casi è probabile che si desideri utilizzare MSBuild Extension Pack o MSBuild Community Tasks per utilizzare la rispettiva attività AssemblyInfo.

Ecco po 'di codice da parte dei nostri script di build:

<!-- 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 .. questo * sembra * come quello di cui ho bisogno. Proverò a provarlo. –

+0

Grazie! Abbastanza potente, una volta che lo fai funzionare. –

+0

La sovrapposizione della catena delle dipendenze di destinazione ha aggiunto un po 'di rumore in VS, ogni volta che lo costruisco chiede se voglio caricare il file AssemblyInfo.cs aggiornato che è piuttosto fastidioso. Come soluzione temporanea, ho usato ''. Come previsto, gli avvisi sono andati via in VS e MSBuild sulla CLI riprende ancora le modifiche. Grande! – Hovis

18

di risposta Sneal è stato molto disponibile, ma mi piacerebbe mostrare quello che effettivamente finito per fare. Invece di modificare i file csproj (ce ne sono diversi) ho invece aggiunto compiti al mio script di compilazione. Ecco un frammento:

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

Poi, posso ignorare le mie variabili dalla riga di comando, o di uno script batch, in questo modo:

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

Molto interessante ... grazie come costruire la riga di comando è direttamente quello con cui sto lavorando. – DRapp

Problemi correlati