2012-01-05 29 views
11

Tôi đang viết một tệp lô để tự động hóa một loạt tác vụ. Một trong những nhiệm vụ này là cập nhật phiên bản của các dll trong giải pháp của tôi, bằng cách chỉnh sửa tập tin assemblyinfo.cs trong các dự án khác nhau trong giải pháp của tôi; và sau đó cuối cùng gọi msbuild.exe để biên dịch giải pháp.MSbuild để cập nhật tệp assemblyinfo

Về vấn đề này, có thể viết tập lệnh dòng lệnh để cập nhật các tệp assemblyinfo.cs khác nhau trong giải pháp .net của tôi. Tôi muốn gọi msbuild từ commandline chính nó và không tạo một tập tin msbuild script.

Làm cách nào để thực hiện điều này bằng MSBuild? CÒn cách nào khác để thực hiện việc này không?

Cảm ơn thời gian của bạn ...

+0

Sử dụng msbuild: http://stackoverflow.com/questions/4562845/how-can-i-change-assembly-version-number-using-assemblyinfotask/4970347#4970347 –

+2

không có cử tri xuống có lý do từ chối bỏ phiếu hoặc là cử tri xuống chỉ có một ngày tồi tệ? – user20358

Trả lời

9

Chỉnh sửa file với dos batch file cmd là khá lông mà không cần sự giúp đỡ của các công cụ khác. Bạn sẽ cần sử dụng một cái gì đó như lệnh for/f để duyệt qua các dòng và sau đó xử lý từng dòng. Ví dụ, tìm dòng bắt đầu: "[assembly: AssemblyVersion" và thay thế nó bằng một thứ khác.

Tuy nhiên, nếu bạn không có nhiều trong AssemblyInfo.cs (và nhớ bạn có thể chia AssemblyInfo.cs thành nhiều tệp cs nếu bạn muốn) Tôi khuyên bạn nên tạo tệp từ đầu bằng một vài tiếng vọng các câu lệnh.

Nếu bạn có các công cụ khác có sẵn như sed.exe, các chỉnh sửa có thể được thực hiện dễ dàng.

Sở thích của tôi trong những ngày này sẽ là để đi cho một kịch bản PowerShell tầm thường, có thể ăn này cho bữa ăn sáng và cung cấp cho bạn truy cập vào thư viện. Net nếu bạn cần.

Dưới đây là một hình thức khuôn mẫu của nó:

(Get-Content AssemblyInfo.template.cs) -replace "{version}","1.2.3.4" > AssemblyInfo.cs 

Dưới đây là một hình thức sử dụng biểu thức thông thường để thay thế bất cứ số phiên bản là ở đó:

$x = 'Version("{0}")' -f "1.2.3.4" 
$content = Get-Content AssemblyInfo.cs 
$content -replace 'Version\(".*"\)',$x > AssemblyInfo.cs 
+0

Tôi không biết cụm từ thông dụng. Tôi đã thử dòng bạn đề xuất ở trên và nó đã xóa sạch tệp AssemblyInfo.cs. – user20358

+1

Xin lỗi về điều đó, các đường ống đã cắt ngắn tập tin gốc trước khi nó hoàn thành/bắt đầu đọc nó. Tôi đã chỉnh sửa ví dụ với bản sửa lỗi để đọc nội dung gốc dưới dạng một bước riêng biệt. – StephenD

7

là không có một MS Build nhiệm vụ cho sửa đổi assemblyInfo.cs

chúng tôi có một cái gì đó như thế này trong publish.proj

của chúng tôi
<Target Name="SolutionInfo"> 
    <Message Text="Creating Version File:  $(Major).$(Minor).$(Build).$(Revision)"/> 


<AssemblyInfo 
     CodeLanguage="CS" 
     OutputFile="$(BuildInputDir)\SolutionInfo.cs" 
     AssemblyTitle="$(Company) $(Product)$(ProductAppendix)" 
     AssemblyDescription="$(Company) $(Product)$(ProductAppendix)" 
     AssemblyCompany="$(Company)" 
     AssemblyProduct="$(Product)" 
     AssemblyCopyright="Copyright © $(Company)"  
     ComVisible="false" 
     CLSCompliant="false" 
     Guid="9E77382C-5FE3-4313-B099-7A9F24A4C328" 
     AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)" 
     AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" /> 
</Target> 
+0

tôi có thể đặt nó vào tập tin batch của tôi không? Tôi đang tìm một cái gì đó tôi có thể gọi ra từ tập tin batch của tôi như vậy ... msbuild {toàn bộ các tham số sau đây ..} – user20358

+0

@ user20358 chắc chắn chỉ cần đặt nó vào một tập tin .proj và gọi MSBuild với một cái gì đó như thế này: " % windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe "/ nologo/verbosity: normal publishing.proj% */property: ReleaseTier = stable – Cilvic

8

Đây là mã MSBuild mục tiêu mà tôi cập nhật tất cả các file AssemblyInfo.cs của tôi (Bạn phải init mục AssemblyInfoFilesToUpdate bộ sưu tập trước khi sử dụng mục tiêu này):

<!-- Update all the assembly info files with generated version info --> 
    <Target Name="AfterGet" Condition="'$(ServerBuild)'=='true' And '$(BuildVersion)'!=''"> 
    <Message Text="Modifying AssemblyInfo files..." /> 
    <!-- Clear read-only attributes --> 
    <Attrib Files="@(AssemblyInfoFilesToUpdate)" Normal="true" /> 
    <!-- Update AssemblyVersion --> 
    <FileUpdate Files="@(AssemblyInfoFilesToUpdate)" 
      Regex="AssemblyVersion\(&quot;.*&quot;\)\]" 
      ReplacementText="AssemblyVersion(&quot;$(BuildVersion)&quot;)]" /> 
    <!-- Update AssemblyFileVersion --> 
    <FileUpdate Files="@(AssemblyInfoFilesToUpdate)" 
      Regex="AssemblyFileVersion\(&quot;.*&quot;\)\]" 
      ReplacementText="AssemblyFileVersion(&quot;$(BuildVersion)&quot;)]" /> 
    <Message Text="AssemblyInfo files updated to version &quot;$(BuildVersion)&quot;" /> 
    </Target> 

Tôi đang sử dụng FileUpdate task from MSBuildCommunityTasks.

+0

Hoặc bạn có thể sử dụng tác vụ' FileUpdate' một lần bằng cách chỉ định ' Đối số Regex' là 'Regex =" (\ d +) \. (\ D +) \. (\ D +) \. (\ D +) "'. –

+0

@DerekW Điều đó có thể có hậu quả không mong muốn. –

+0

@RhysBevilaqua: Bạn có thể cung cấp một ví dụ (một nơi AssemblyFileVersion và AssemblyVersion là giống nhau) không? –

2

Câu hỏi khá cũ với câu trả lời được chấp nhận, nhưng tôi cũng (do giới hạn trên máy chủ xây dựng CI) muốn thực hiện việc này thông qua tệp batch thay vì PowerShell hoặc MS Build Tasks. Dưới đây là những gì tôi nghĩ ra - giả sử thư mục giải pháp là thư mục hiện tại:

SetVersion.dơi

@echo off 
setlocal enabledelayedexpansion 

if [%1] == [] GOTO :USAGE 
set version=%1 
set fileversion=%1 
set informationalversion=%1 

if [%2] NEQ [] SET fileversion=%2 
if [%3] NEQ [] SET informationalversion=%3 

echo Setting assembly version information 

for /F "delims=" %%f in ('dir /s /b Assemblyinfo.cs') do (
    echo ^> %%f 

    pushd %%~dpf 

    for /F "usebackq delims=" %%g in ("AssemblyInfo.cs") do (
     set ln=%%g 
     set skip=0 

     if "!ln:AssemblyVersion=!" NEQ "!ln!" set skip=1 
     if "!ln:AssemblyFileVersion=!" NEQ "!ln!" set skip=1 
     if "!ln:AssemblyInformationalVersion=!" NEQ "!ln!" set skip=1 

     if !skip!==0 echo !ln! >> AssemblyInfo.cs.versioned 
    ) 

    echo [assembly: AssemblyVersion^("%version%"^)] >> AssemblyInfo.cs.versioned 
    echo [assembly: AssemblyFileVersion^("%fileversion%"^)] >> AssemblyInfo.cs.versioned 
    echo [assembly: AssemblyInformationalVersion^("%informationalversion%"^)] >> AssemblyInfo.cs.versioned 

    copy /y AssemblyInfo.cs AssemblyInfo.cs.orig 
    move /y AssemblyInfo.cs.versioned AssemblyInfo.cs 

    popd 
) 
echo Done^^! 

GOTO:EOF 

:USAGE 
echo Usage: 
echo. 
echo SetVersion.bat Version [FileVersion] [InformationalVersion] 
echo. 

Giải thích

Về cơ bản này sẽ recurse tất cả các thư mục con và xác định các file AssemblyInfo.cs, và sau đó line-by-line sao chép các tập tin vào một tập tin mới. Nếu bất kỳ mục nhập phiên bản lắp ráp nào được tìm thấy thì chúng sẽ bị bỏ qua. Sau đó, ở cuối mỗi tệp, nó sẽ nối thêm số phiên bản được cung cấp.

Đối với những nhóm chuyên gia này, một số có thể hỏi lý do tại sao tôi thích sử dụng for /F với dir /s thay vì for /R để lặp qua các tệp. Về cơ bản, nó bởi vì tôi tìm thấy đệ quy cho là một chút clunky vì nó sẽ thực hiện cho tất cả các thư mục con (không chỉ phù hợp với các tập tin) khi không có ký tự đại diện được cung cấp. Sử dụng lệnh dir phù hợp hơn và dễ dự đoán hơn.

Lưu ý: tập tin thực thi này sẽ loại bỏ tất cả các dòng sản phẩm nào từ AssemblyInfo.cs file

+0

wow. Cảm ơn nhiều. Điều này đã cứu tôi từ rất nhiều công việc –

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