Отслеживание версий на уровне файлов в сборках с использованием Visual Studio и .NET?

Я хочу, чтобы инструмент или техника могли ответить на вопрос "Какая версия файла X использовалась для сборки Assembly abc.dll?" Недавно я перешел в группу разработчиков .NET, и кажется, что этот вопрос возникает все время, в той или иной форме, и мы не совсем с ним разбираемся. Кто-то скажет что-то вроде «Эй, твой последний код на тестовом сервере?» и ответ неизбежно что-то вроде «я не знаю».

В старые времена разработки Unix (здесь я встречаюсь с самим собой) система управления исходным кодом SCCS имела специальные ключевые слова, такие как %I% (версия) и %M% (имя модуля), которые вы можете поместить в свой файл, которые будут заменены соответствующими Информация о версии SCCS при извлечении файла. Так что ловкий трюк, который вы можете сделать, это присвоить постоянную строку «%I% %M%» в вашем исходном файле, скомпилировать, а затем запустить команду Unix "strings" в полученной библиотеке, чтобы определить, какие версии файлов использовались для создания этого файла.

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

public const String VERSION_STRING = "*VERSION* = MyClass 1.0";

Затем запустил эту командную строку в моем каталоге DLL:

>for %f in (*.dll) do find "VERSION" %f

Но результаты были:

---------- MYASSEMBLY.DLL
VERSION_STRING

Это не совсем то, что мне нужно (это дало мне имя константы, но не информацию о версии, которую я пытался вручную встроить в класс).

Что бы это ни стоило, мы в настоящее время используем Clearcase для нашего контроля версий (в настоящее время стандарт компании). В Clearcase есть несколько инструментов, которые могут помочь нам в этом (например, clearaudit). ), но это потребует некоторых усилий по совершенствованию и переоснащению нашего процесса сборки. Я также должен упомянуть, что мы рассматриваем возможность пилотного перехода на подрывную деятельность. Поэтому я думаю, что решения, которые работают с .NET в любой из различных систем контроля версий или сред сборки (MSBuild, NAnt, CruiseControl), являются справедливой игрой.

Существуют ли какие-либо другие, особенно ориентированные на .NET, решения для отслеживания того, какая версия какого файла вошла в какую сборку?


person Ogre Psalm33    schedule 02.06.2009    source источник


Ответы (3)


Мы быстро отказались от идеи использования специальных ключевых слов, поскольку интегрирование метаданных (например, номера версии) в данные (файлы, хранящиеся в системе контроля версий), как правило, не очень хорошая идея (см. обсуждение в этом SO-вопросе: "Встроенные номера версий - хорошо или плохо?" )

Наш подход состоит в том, чтобы создать «примечание к выпуску» с такой информацией. Затем этот простой текстовый файл сохраняется вместе с библиотекой сборки.

person VonC    schedule 03.06.2009
comment
Да, я понимаю, что с Clearcase встраивание информации о версии не лучший вариант. Жаль, что он не работает больше как SCCS или RCS, где информация о версии может быть заменена по запросу, но не сохраняется в файле. Хотя, прочитав эту ссылку, я вижу, где этот подход также может иметь несколько проблем. Я предполагаю, что подход Clearcase для создания отдельной записи конфигурации для производных объектов становится очень полезным. (Вы даже можете создать примечание к выпуску из записи конфигурации, если хотите). - person Ogre Psalm33; 03.06.2009
comment
@Ogre: Действительно, но на практике мы никогда не использовали DO. нам хватило более общего списка версий, написанного после сборки. - person VonC; 03.06.2009
comment
Из решений и ответов, представленных до сих пор, мне нравится это лучше всего. Независимо от того, используете ли вы nant или msbuild, автоматизировать решение такого типа не должно быть слишком сложно. - person Ogre Psalm33; 10.06.2009

У меня есть положительный опыт работы с SubVersion и сервером непрерывной интеграции CC.NET.

Вы бы установили цель NAnt, которая захватывает последнюю версию (здесь она может заблокировать репозиторий), а затем создает. После завершения сборки он создает тег версии в SVN.

Версию файла можно легко вывести из версии тега при построении.

person GregC    schedule 03.06.2009
comment
Предлагает ли Subversion способ объединить версии, которыми отмечены все исходные файлы (a.cs, ​​b.cs, c.cs), и каким-то образом прикрепить всю эту информацию к полученному DLL-файлу? Clearcase предлагает эту возможность (хотя мы еще не используем ее в этом проекте), поэтому, прежде чем мы приступим к пилотному запуску или переключимся на другую систему управления версиями, я хочу посмотреть, что мы выиграем или потеряем. - person Ogre Psalm33; 03.06.2009
comment
Репозиторий помечен номером ревизии в целом. Номер версии файла присваивается при каждой регистрации. Эти числа взяты из одного и того же пула. Таким образом, если версии файла 1,2,5,8,9, а версия тега сборки равна 7, то использовался файл из версии 5. - person GregC; 03.06.2009
comment
Да, я немного больше читал о Subversion и других VCS. Похоже, что эта функция Subversion делает ее удобной для определения того, что когда входит в сборку (и результирующую сборку). - person Ogre Psalm33; 03.06.2009
comment
Мы использовали МКС лет 10 назад. И нет, я не настолько стар. Я видел теги и ненавидел их. - person GregC; 04.06.2009

Для своей «общественной» работы я использую простую схему; Я использую номер версии SVN в качестве версии сборки в атрибутах [AssemblyVersion]/[AssemblyFileVersion] сборки. Их довольно легко запрашивать как во время выполнения, так и через проводник, и скрипт для их обновления тоже довольно прост - первые несколько задач здесь.

person Marc Gravell    schedule 02.06.2009