Question

J'ai un script MSBuild qui compile ma solution existante mais je voudrais changer certaines propriétés de l'un des projets dans les la solution à la compilation, y compris mais sans s'y limiter AssemblyProduct et AssemblyTitle .

Voici un extrait de mon script de compilation:

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

J'ai un exécutable principal et plusieurs DLL qui sont compilés. Je suis conscient du MSBuild Extension Pack et je pense qu'il pourrait me aider à arriver là où je dois être, bien que je ne suis pas sûr de savoir comment procéder.

Puis-je modifier sélectivement les propriétés AssemblyInfo au moment de la construction?

Était-ce utile?

La solution

Vous êtes sur la bonne voie avec le pack d'extension MSBuild.

Je trouve la meilleure façon de générer conditionnellement les détails d'assemblage au moment de la construction est d'ajouter une cible « AssemblyVersion » directement à mon .csproj (s) qui nécessitent un fichier AssemblyInfo mis à jour. Vous pouvez ajouter la cible directement à chaque fichier csproj qui nécessite un fichier AssemblyInfo mis à jour, ou comme je préfère le faire, créez un fichier de cibles personnalisées avec la cible AssemblyVersion et ont chaque fichier csproj inclure votre fichier cibles personnalisées.

De toute façon, vous voudrez probablement utiliser le pack d'extension MSBuild ou les MSBuild tâches communautaires d'utiliser leur tâche AssemblyInfo respective.

Voici un code de nos build scripts:

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

Autres conseils

La réponse de Sneal a été très utile, mais je voudrais montrer ce que j'ai fini par faire. Au lieu de modifier les fichiers de csproj (il y en a plusieurs) Je tâches plutôt ajouté à mon script de compilation. Voici un extrait:

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

Alors, je peux passer outre mes variables à partir de la ligne de commande ou un script de traitement par lots, comme suit:

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%
<Target Name="SetVersion">
<ItemGroup>
  <AssemblyInfoFiles  Include="$(TargetDir)\**\AssemblyInfo.cs"/>
</ItemGroup>

<Message Text="change the Version number for:"/>
<Message Text="%(AssemblyInfoFiles.FullPath)"/>

<MSbuild.ExtensionPack.Framework.AssemblyInfo 
 AssemblyInfoFiles="@(AssemblyInfoFiles)"
                                              AssemblyTitle="newTitle"
                                              AssemblyMajorVersion="2"
                                              AssemblyMinorVersion="0"/>

 </Target>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top