MSbuild для обновления файла assemblyinfo - PullRequest
12 голосов
/ 05 января 2012

Я пишу командный файл для автоматизации ряда задач. Одной из этих задач является обновление версии dll в моем решении путем редактирования файла assemblyinfo.cs в различных проектах моего решения; и, наконец, вызов msbuild.exe для компиляции решения.

В связи с этим можно ли написать скрипт командной строки для обновления различных файлов assemblyinfo.cs в моем решении .net. Я бы предпочел вызывать msbuild из самой командной строки, а не создавать другой файл сценария msbuild.

Как это сделать с помощью MSBuild? Есть ли другой способ сделать это?

Спасибо за ваше время ...

Ответы [ 5 ]

9 голосов
/ 06 января 2012

Это целевой код MSBuild, в котором я обновляю все мои файлы assemblyinfo.cs (необходимо использовать коллекции элементов AssemblyInfoFilesToUpdate перед использованием этой цели):

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

Я использую задачу FileUpdateот MSBuildCommunityTasks .

9 голосов
/ 05 января 2012

Редактирование файлов с помощью командных файлов dos cmd довольно сложно без помощи других инструментов. Вам нужно будет использовать что-то вроде команды for / f, чтобы пройти по строкам, а затем обработать каждую строку. Например, найдите строку, которая начинается: «[assembly: AssemblyVersion» и заменить его чем-то другим.

Однако, если в вашем AssemblyInfo.cs мало что есть (и помните, что вы можете разбить AssemblyInfo.cs на несколько файлов cs, если хотите), я бы предложил создать файл с нуля с помощью нескольких операторов echo. .

Если у вас есть другие инструменты, такие как sed.exe, редактирование можно выполнить легко.

В настоящее время я предпочитаю использовать тривиальный сценарий PowerShell, который может съесть его на завтрак и дать вам доступ к библиотекам .Net, если вам это нужно.

Вот шаблонная форма этого:

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

Вот форма, которая использует регулярные выражения для замены любого номера версии:

$x = 'Version("{0}")' -f "1.2.3.4"
$content = Get-Content AssemblyInfo.cs
$content -replace 'Version\(".*"\)',$x > AssemblyInfo.cs
7 голосов
/ 05 января 2012

Нет ли задачи MS Build для изменения assemblyInfo.cs

у нас есть что-то подобное в нашем publish.proj

<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>
3 голосов
/ 04 декабря 2015

Довольно старый вопрос с принятым ответом, но я также (из-за ограничений на сервере сборки CI) хотел сделать это через пакетный файл вместо powershell или MS Build Tasks.Вот что я придумал - предполагается, что каталогом решений является текущий каталог:

SetVersion.bat

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

Объяснение

По сути, это будет повторять все подпапки и идентифицировать файлы AssemblyInfo.cs, а затем построчно копировать файлы в новый файл.Если найдены какие-либо записи версии сборки, они пропускаются.Затем в конце каждого файла добавляются предоставленные номера версий.

Для этих групповых гуру некоторые могут спросить, почему я предпочитаю использовать for /F с dir /s вместо for /R для итерацииповерх файлов.По сути, это потому, что я считаю, что рекурсивный метод является немного неуклюжим, поскольку он будет выполняться для всех подкаталогов (не только для совпадающих файлов), если подстановочные знаки не указаны.Использование команды dir более согласованно и проще для прогнозирования.

Примечание. Этот пакетный файл удалит все пустые строки из файлов AssemblyInfo.cs

0 голосов
/ 17 августа 2017

Используйте WriteCodeFragment MSBuild Task . См. этот ответ для примера.

...