2012-04-18 9 views
13

У меня есть Team Foundation Server Build, работающая чисто. Он производит несколько сборок, и я хотел бы, чтобы версии сборок имели последнее число, которое должно быть changset. То есть, если я совершаю команду changeet11667, например, номер версии сборки должен быть «x.y.z.11667». Я проверил доступные макросы, но ни один из них не является номером набора изменений.Получение TFS для установки набора изменений в версии сборки

Мне все равно хотелось бы создать файл решения на моей машине dev, как обычно, только с помощью проверенного номера версии.

Как я могу получить это на месте?

ответ

2

В конце концов мой коллега написал следующую задачу MSBuild, которая решила проблему.

public class GetNextBuildNumber : Task 
{ 
    [Required] 
    public string TfsCommand { get; set; } 

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

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

    public override bool Execute() 
    { 
     BuildNumber = GetLatestVersionNumber(); 
     return true; 
    } 

    private int GetLatestVersionNumber() 
    { 
     var process = new RunProcess(); 
     var result = process.ExecuteCommand(TfsCommand, TfsArgument); 

     return ParseResult(result); 
    } 

    private int ParseResult(string result) 
    { 
     const string changeset = "Changeset:"; 
     const string user = "User:"; 

     if (string.IsNullOrEmpty(result) || !result.Contains(changeset)) 
     { 
      // Invalid result 
      Log.LogWarning("Could not get latest build number. Reason: " + result); 
      return 0; 
     } 

     var indexOfChangeset = result.IndexOf(changeset, StringComparison.InvariantCulture) + changeset.Length; 
     var indexOfUser = result.IndexOf(user, StringComparison.InvariantCulture); 
     var revision = result.Substring(indexOfChangeset, indexOfUser - indexOfChangeset).Trim(); 

     return Convert.ToInt32(revision); 
    } 

} 
+0

Куда поместить задачу пользовательской сборки - вместе с решением для сборки? Как выглядит соответствующее определение сборки? – mbx

+0

В каком пространстве имен находится RunProcess? Он совместим с .net 3.5? –

+0

Мне жаль, что я не записал, как использовать этого кода, у меня больше нет памяти об этом. – vidstige

3

Посмотрите на Community TFS Build Extension project on CodePlex. Он содержит AssemblyInfo activity и TfsVersion activity, которые могут изменять информацию о сборке во время процесса сборки с использованием пользовательского формата.

Чтобы использовать его на своем компьютере-разработчике, вы должны сами реализовать эти расширения, используя командные файлы и утилиты командной строки TFS.

+0

хорошо, круто. Поэтому мне пришлось бы сделать какую-то специальную сборку. Сегодня я только указываю файл решения, и он просто работает – vidstige

+0

Вы можете получить номер набора изменений, используя ответ на этот пост: http://stackoverflow.com/questions/11748338/tf-exe-on-tfspreview/12923581 –

6

Поймите, что это прекратит работать, если вы превысите 65 535 изменений. Возможно, вы хотите обновить другое поле. Кстати, да, строительная техника - это техника. Указывать на решение и говорить, что он должен строить, это только начало путешествия.

+1

да, спасибо за подсказку. При нынешних темпах проверки, которые произойдут примерно через 32 года, я сомневаюсь, что мы ударим по этой кепке. Из любопытства, что такое шапка? Это версия сборки, которая составляет всего 16 бит, или количество изменений, ограниченных в контроле источника? – vidstige

+0

также, важный принцип enginerring - это просто. Я хочу, чтобы иметь возможность создавать мое решение, просто проверяя его и запуская без каких-либо скриптов. Сервер сборки должен имитировать это как можно ближе, чтобы избежать проблем, которые он создает на сервере сборки, но не на моей машине dev. За исключением нескольких дополнений, которые, конечно же, выполняются только на машине сборки, как и номер версии сборки. – vidstige

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/aa381058(v=vs.85).aspx –

0

С какой целью вы хотели это сделать? Если вы хотите иметь отношение между DLL и исходным кодом, чтобы извлечь из TFS, лучший способ - индексировать символы, используя TFS Source Control в генерации PDB. Таким образом, при отладке любой версии вашего программного обеспечения Visual Studio получит нужную версию источника из TFS, когда это необходимо.

+0

У меня есть сообщение о сбоях с использованием bugsense. Я получаю только стек и номер версии. Чтобы понять смысл stacktrace, мне нужно знать, как источник посмотрел время сборки. – vidstige

+0

Вы не можете отправить PDB с вашим приложением? Похоже, что это не для производственных целей (я полагаю, вы знаете, что версия отправлена). – Nock

+0

Корабль PDB? Не кажется хорошей идеей. Он будет развернут, щелкнув один раз. Да, это для «производства», но еще не выпущено. И да, я хотел бы знать, что версия отправлена. Мы «грузим» ежедневно для тестирования, и позже мы, вероятно, дойдем до нескольких кораблей, прежде чем оседать на стабильной версии. – vidstige

3

Я работаю на инструмент для автоматизации процесса сборки он все еще находится на разработке и это с открытым исходным кодом здесь ссылка (я планирую выпуск в течение одной недели):

https://github.com/jupaol/NCastor

сейчас Я бы порекомендовал вам проверить семантические версии:

http://semver.org/

чтобы получить последнюю ревизию с TFS, у вас есть несколько вариантов:

Я построил пользовательский режим для того чтобы сделать это

https://github.com/jupaol/NCastor/blob/develop/Solutions/NCastor.AutoBuilder/NCastor.AutoBuilder.Runner/Targets/Build/Versioning/VersionControlServers/TFS/GetTFSRevisionVersion.target

Я должен был построить эту процедуру, потому что задачи сообщества и задача MSBuild Extenssions не работали на 64bits машины, если вы используете 32бит машину строить, то вы можете использовать следующие задачи:

Использование http://msbuildextensionpack.codeplex.com/

<UsingTask AssemblyFile="$(ExtensionTasksPath)MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.VisualStudio.TfsVersion"/> 

Использование 0

<UsingTask AssemblyFile="$(MSBuildCommunityTasksLib)" TaskName="MSBuild.Community.Tasks.Tfs.TfsVersion" /> 

Пример для установки различных версий:

<UsingTask AssemblyFile="$(MSBuildCommunityTasksLib)" TaskName="MSBuild.Community.Tasks.AssemblyInfo" /> 

<MSBuild.Community.tasks.AssemblyInfo OutputFile="$(AssemblyVersionFilePath)" 
      CodeLanguage="C#" 
      AssemblyFileVersion="$(FileVersion)" 
      AssemblyInformationalVersion="$(InformationalVersion)" 
      AssemblyVersion="$(SemanticVersion)" /> 

После того, как вы создали файл, просто добавьте этот файл в качестве ссылки на каждый проект и вуаля! все ваши проекты разделяют общую сборку.

+0

Как-то обрабатывает ли ваш инструмент семантическое управление версиями? У вас есть способ попросить пользователя проверить/сгенерировать/слить источник для нового номера версии? –

+0

В нем используется семантический формат форматирования. Перед выпуском версия должна быть обновлена ​​в соответствии с правилами семантического управления версиями. – Jupaol

Смежные вопросы