2010-08-27 23 views
18

Tôi có một kịch bản MSBuild mà biên dịch giải pháp hiện tại của tôi nhưng tôi muốn thay đổi một số thuộc tính của một trong các dự án trong giải pháp tại thời gian biên dịch, bao gồm nhưng không giới hạn ở AssemblyProduct và AssemblyTitle.Làm cách nào để thay đổi AssemblyProduct, AssemblyTitle bằng MSBuild?

Dưới đây là một đoạn xây dựng kịch bản của tôi:

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

Tôi đã có một DLL thực thi và một số chính được biên soạn. Tôi biết về số MSBuild Extension Pack và tôi nghi ngờ nó có thể giúp tôi đến nơi tôi cần, mặc dù tôi không chắc chắn làm thế nào để tiến hành.

Tôi có thể thay đổi có chọn lọc các thuộc tính AssemblyInfo tại thời gian xây dựng không?

+0

Ra khỏi tò mò, tại sao bạn sẽ muốn làm điều đó? Tôi muốn được quan tâm đến việc biết một kịch bản thế giới thực. –

+0

@RaheelKhan: Tự động xây dựng các tập lệnh bên ngoài Visual Studio. Kịch bản như vậy đặt một số phiên bản cụ thể, thực hiện một bản dựng, tạo trình cài đặt và tùy chọn tải lên trình cài đặt đã hoàn thành (hoàn tất với tên sản phẩm và số phiên bản trong tên tệp) lên Internet. Nếu bạn có 12 biến thể của cùng một sản phẩm (mỗi sản phẩm có tên sản phẩm khác nhau) mà bạn cập nhật vài ngày một lần, việc có giải pháp một cú nhấp chuột cho mỗi sản phẩm là cách để đi. Xem xét quá rằng chạy một kịch bản như vậy có thể được thực hiện bởi một người không phải là một lập trình viên. –

+0

Cảm ơn bạn vì thông tin chi tiết đó. –

Trả lời

21

Bạn đang đi đúng hướng với Gói mở rộng MSBuild.

Tôi tìm cách dễ nhất để tạo điều kiện chi tiết lắp ráp tại thời gian xây dựng là thêm mục tiêu "AssemblyVersion" trực tiếp vào tệp .csproj của tôi yêu cầu tệp AssemblyInfo đã cập nhật. Bạn có thể thêm trực tiếp mục tiêu vào mỗi tệp csproj yêu cầu tệp AssemblyInfo đã cập nhật hoặc tôi muốn tạo tệp mục tiêu tùy chỉnh với mục tiêu AssemblyVersion và có mỗi tệp csproj bao gồm tệp mục tiêu tùy chỉnh của bạn.

Dù bằng cách nào bạn có thể muốn sử dụng Gói mở rộng MSBuild hoặc MSBuild Community Tasks để sử dụng nhiệm vụ AssemblyInfo tương ứng.

Dưới đây là một số mã từ xây dựng các kịch bản của chúng tôi:

<!-- 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 .. này * trông * giống như những gì tôi cần. Tôi sẽ cố gắng để cho nó một đi. –

+0

Cảm ơn! Khá mạnh mẽ, một khi bạn làm cho nó hoạt động. –

+0

Vượt qua chuỗi phụ thuộc mục tiêu đã thêm một số nhiễu trong VS, mỗi lần tôi xây dựng nó hỏi tôi có muốn tải tệp AssemblyInfo.cs đã cập nhật hay không. Như một giải pháp thay thế, tôi đã sử dụng '' thay thế. Theo dự kiến, các cảnh báo đã biến mất trong VS và MSBuild trên CLI vẫn chọn các thay đổi. Tuyệt quá! – Hovis

18

Sneal của câu trả lời là rất hữu ích, nhưng tôi muốn hiển thị những gì tôi thực sự đã kết thúc làm. Thay vì chỉnh sửa các tệp csproj (có một số), thay vào đó tôi đã thêm các tác vụ vào kịch bản xây dựng của mình. Dưới đây là một đoạn:

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

Sau đó, tôi có thể ghi đè lên các biến tôi từ dòng lệnh, hoặc một kịch bản hàng loạt, như vậy:

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

Rất thú vị ... nhờ xây dựng dòng lệnh là trực tiếp những gì tôi đang làm việc với quá. – DRapp

Các vấn đề liên quan