Я не могу ответить на все ваши вопросы, так как у меня нет опыта работы с TFS.
Но я могу порекомендовать более подходящий подход для обновления файлов AssemblyInfo.cs, чем при использовании задачи AssemblyInfo. Эта задача, кажется, просто воссоздает стандартный файл AssemblyInfo с нуля и теряет все пользовательские части, которые вы, возможно, добавили.
По этой причине я предлагаю вам изучить задачу FileUpdate из проекта MSBuild Community Tasks. Он может искать конкретный контент в файле и заменять его следующим образом:
<FileUpdate
Files="$(WebDir)\Properties\AssemblyInfo.cs"
Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="$(Major).$(ServicePack).$(Build).$(Revision)"
Condition="'$(Configuration)' == 'Release'"
/>
Существует несколько способов управления увеличением номера сборки. Поскольку я хочу, чтобы номер сборки увеличивался только при полной успешной сборке, я использую двухэтапный метод:
- прочитать число из текстового файла (единственное, что в файле - число) и добавить 1 без изменения файла;
- В качестве последнего шага в процессе сборки, если все прошло успешно, сохраните увеличенное число обратно в текстовый файл.
Существуют такие задачи, как ReadLinesFromFile, которые могут помочь вам в этом, но я нашел, что проще всего написать небольшую пользовательскую задачу:
using System;
using System.IO;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace CredibleCustomBuildTasks
{
public class IncrementTask : Task
{
[Required]
public bool SaveChange { get; set; }
[Required]
public string IncrementFileName { get; set; }
[Output]
public int Increment { get; set; }
public override bool Execute()
{
if (File.Exists(IncrementFileName))
{
string lines = File.ReadAllText(IncrementFileName);
int result;
if(Int32.TryParse(lines, out result))
{
Increment = result + 1;
}
else
{
Log.LogError("Unable to parse integer in '{0}' (contents of {1})");
return false;
}
}
else
{
Increment = 1;
}
if (SaveChange)
{
File.Delete(IncrementFileName);
File.WriteAllText(IncrementFileName, Increment.ToString());
}
return true;
}
}
}
Я использую это перед FileUpdateTask, чтобы получить следующий номер сборки:
<IncrementTask
IncrementFileName="$(BuildNumberFile)"
SaveChange="false">
<Output TaskParameter="Increment" PropertyName="Build" />
</IncrementTask>
и как мой последний шаг (до уведомления других) в сборке:
<IncrementTask
IncrementFileName="$(BuildNumberFile)"
SaveChange="true"
Condition="'$(Configuration)' == 'Release'" />
Ваш другой вопрос о том, как обновлять номер версии только после изменения исходного кода, сильно зависит от того, как ваш процесс сборки взаимодействует с вашим источником контроля. Обычно проверка изменений исходного файла должна инициировать сборку Continuous Integration. Это тот, который используется для обновления соответствующего номера версии.