2010-08-27 58 views
18

我有一個編譯我現有解決方案的MSBuild腳本,但我想在編譯時更改解決方案中的其中一個項目的某些屬性,包括但不限於AssemblyProduct和AssemblyTitle。如何使用MSBuild更改AssemblyProduct,AssemblyTitle?

這裏是我的構建腳本的一個片段:

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

我已經得到了編譯一個主要的可執行文件和幾個DLL文件。我知道MSBuild Extension Pack,我懷疑它可能會幫助我到達需要的地方,儘管我不知道如何繼續。

我可以在構建時有選擇地更改AssemblyInfo屬性嗎?

+0

出於好奇,爲什麼你要這麼做?我有興趣瞭解一個真實世界的場景。 – 2013-07-02 05:48:29

+0

@RaheelKhan:在Visual Studio之外自動構建腳本。這樣的腳本會設置特定的版本號,執行構建,生成安裝程序,並可選擇將完成的安裝程序(文件名中包含產品名稱和版本號)上載到Internet。如果您每12天更新一次同一產品(每個產品名稱不同),每隔幾天更新一次,每個解決方案都是一鍵式解決方案。也要考慮到運行這樣的腳本可以由不是程序員的人來完成。 – 2013-07-04 00:01:48

+0

謝謝你的洞察力。 – 2013-07-04 03:57:41

回答

21

你在MSBuild擴展包的正確軌道上。

我發現在構建時有條件地生成程序集詳細信息的最簡單方法是將「AssemblyVersion」目標直接添加到需要更新的AssemblyInfo文件的.csproj文件中。您可以直接將目標添加到每個需要更新的AssemblyInfo文件的csproj文件,或者我喜歡這樣做,請使用AssemblyVersion目標創建一個自定義目標文件,並讓每個csproj文件包含您的自定義目標文件。

無論哪種方式,您可能想要使用MSBuild擴展包或MSBuild Community Tasks來使用其各自的AssemblyInfo任務。

這是我們從構建腳本一些代碼:

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

嗯..這*看起來像我需要的東西。我會盡力給它一個。 – 2010-09-01 23:56:20

+0

謝謝!相當強大,一旦你得到它的工作。 – 2010-09-02 03:48:26

+0

Overiding目標依賴鏈在VS中添加了一些噪音,每次構建時都會詢問我是否要加載更新的AssemblyInfo.cs文件,這有點煩人。 作爲一種解決方法,我使用了<'而不是。正如預期的那樣,VS中的警報消失了,而CLI中的MSBuild仍然會提取更改。大! – Hovis 2014-07-17 20:22:24

18

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% 
+0

非常有趣...感謝命令行構建直接與我一起工作。 – DRapp 2016-04-01 16:10:48