24.07.2009

Автоматическое увеличение номера билда при автоматической сборке в MS Team Foundation Server

Для организации постоянно увеличивающегося номера сборки необходимо к файлу проекта подключить дополнительную задачу для выполнения. Сделать это можно путем создания .NET сборки, содержащей класс, унаследованный от Microsoft.Build.Utilities.Task.
Класс, содержащий метод для инкрементирования одного числа, записанного в файл может выглядеть следующим образом:

public class IncrementingNumber : Task
{
public override bool Execute()
{
NextNumber = IncrementNumber();
LastNumber = NextNumber - 1;
return true;
}

public int IncrementNumber()
{
using (FileStream fs = new FileStream(NumberFile,
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
StreamReader reader = new StreamReader(fs);

long pos = 0;
String line = reader.ReadLine();

while (line != null && line.StartsWith("#"))
{
pos = pos +
line.Length +
System.Environment.NewLine.Length;
line = reader.ReadLine();
}

int number = -1;
if (line != null)
number = Int32.Parse(line);

NextNumber = number + 1;


fs.Position = pos;

StreamWriter writer = new StreamWriter(fs);
writer.WriteLine(NextNumber.ToString());
writer.Flush();
writer.Close();
}
return NextNumber;
}

[Required]
public string NumberFile { get; set; }

[Output]
public int NextNumber { get; set; }

[Output]
public int LastNumber { get; set; }

}

Метод Execute() должен быть переопределен, потому как именно с него и начинается выполнение задачи. В данном примере свойство NumberFile должно содержать имя файла, в котором хранится сборка, при чем это свойство помечено как обязательно для заполнения. Свойства с атрибутом [Output] хранят результаты выполнения задачи.
Для включения сборки в файл проекта .proj необходимо записать следующий тэг:
<usingtask taskname="" assemblyfile=""></usingtask>
где AssemblyFile - имя файла сборки, а TaskName – имя класса-задачи, включая пространство имен.
Далее, для инкрементирования и установки номера версии сборки необходимо переопределить target BuildNumberOverrideTarget примерно следующим образом:




При отсутствии файла с именем buldnumber.txt в указанном месте, он будет создан задачей IncrementingNumber и в него будет записан 0. Подобным образом можно увеличивать каждую из 4-х частей версии сборки, используя разные файлы и условия для их изменения.

Комментариев нет: