كيف يمكنني تغيير منتج التجميع ، AssemblyTitle باستخدام MSBuild؟

StackOverflow https://stackoverflow.com/questions/3585444

  •  01-10-2019
  •  | 
  •  

سؤال

لديّ برنامج نصي MSBuild يجمع الحل الحالي ، لكنني أرغب في تغيير بعض خصائص أحد المشاريع داخل الحل في وقت الترجمة ، بما في ذلك على سبيل المثال لا الحصر بنية التجميع وتجميع.

إليك مقتطف من نص البناء الخاص بي:

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

لقد حصلت على واحد قابلة للتنفيذ وعدة dlls التي تم تجميعها. أنا على علم MSBuild Extension Pack وأظن أنه قد يساعدني في الوصول إلى المكان الذي يجب أن أكون فيه ، على الرغم من أنني لست متأكدًا من كيفية المتابعة.

هل يمكنني تغيير خصائص AssemblyInfo بشكل انتقائي في وقت البناء؟

هل كانت مفيدة؟

المحلول

أنت على المسار الصحيح مع حزمة امتداد MSBuild.

أجد أسهل طريقة لتوليد تفاصيل التجميع بشرط في وقت البناء هي إضافة هدف "تجميع" مباشرة إلى ملف (ملفات) .csproj التي تتطلب ملف تجميع محدث. يمكنك إضافة الهدف مباشرة إلى كل ملف CSPROJ يتطلب ملف AssemblyInfo محدث ، أو كما أفضل القيام بذلك ، قم بإنشاء ملف أهداف مخصص باستخدام هدف التجميع وجعل كل ملف CSPROJ يتضمن ملف أهدافك المخصصة.

في كلتا الحالتين ، من المحتمل أن ترغب في استخدام حزمة امتداد MSBuild أو MSBUILD المهام المجتمع لاستخدام مهمة التجميع الخاصة بهم.

إليك بعض التعليمات البرمجية من البرامج النصية الخاصة بنا:

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

نصائح أخرى

كانت إجابة Sneal مفيدة للغاية ، لكنني أود أن أوضح ما انتهيت إليه بالفعل. بدلاً من تحرير ملفات CSPROJ (هناك العديد) ، أضفت المهام بدلاً من ذلك البرنامج النصي. هذا مقتطف:

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

بعد ذلك ، يمكنني تجاوز المتغيرات الخاصة بي من سطر الأوامر ، أو نص دفع ، مثل ذلك:

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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top