Давно сие спрашивают, и наконец-то руки дошли. Это все для VC# 2005 Express, но если немного поменять пару строк, то можно и в обычных Win32-проектах использовать.
Работа скрипта основана на простом поиске вхождения указанной подстроки с версией, выдирании фрагмента в кавычках, разборе его и инкрементировании номера ревизии.
Я тут извращения ради изменяю сразу и AssemblyVersion, и AssemblyFileVersion
Если вы пишете под Win, то в файле ресурсов имеется секция VERSIONINFO, порывшись в которой, можно подправить сей скрипт.
Как его использовать?
1. Засуньте в каталог Properties
2. Запишите в свойствах проекта pre-build event как "$(ProjectDir)Properties\buildinc.js", причем, обязательно в кавычках
3. Готово, правда при каждом нажатии на Ctrl+F5, даже если проект уже был до этого собран, pre-build event снова сработает, соответственно, скрипт тоже запустится и build снова произойдет.
Удачи, и жду замечаний.
/*
buildinc.js
Скрипт для автоматического увеличения номера ревизии/сборки
для проектов Visual C# (VS 2005 Express)
файл должен содержать строку вида
[assembly: AssemblyVersion("0.1.0.0")]
эта строка ищется и изменяется с инкрементированием номера ревизии
*/
// чтение содержимого файла
function fnLoadContent(filename)
{
fileObj = new ActiveXObject("Scripting.FileSystemObject");
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
f = fileObj.GetFile(filename);
ts = f.OpenAsTextStream(ForReading, TristateUseDefault);
var s = ts.ReadAll(); // прочитать и вывести весь файл
ts.Close(); // закрыть текстовый поток
return s;
}
// sContent - содержимое файла. В случае обнаружения искомой
// строки оно изменяется на новое значение
function fnIncrementVerInfo(sContent, sAssemblyOrFile)
{
var searchString = sAssemblyOrFile;
var begin = sContent.indexOf(searchString);
if (begin < 0)
return sContent;
begin += searchString.length;
// найти конец строки с информацией о версии
var end = sContent.indexOf("\")]", begin);
if (end < 0)
return sContent;
var verMajor = 0;
var verMinor = 0;
var build = 0;
var revision = 0;
// эту часть текста мы вырежем и заменим новой информацией о версии
var cutBegin = begin;
var cutEnd = end;
// копируем строку с версией
var info = sContent.substring(begin, end);
// разбираем
// старший номер версии
begin = 0;
end = info.indexOf(".");
if (end < 0)
return sContent;
verMajor = info.substring(begin, end);
info = info.substr(end+1);
// младший номер версии
begin = 0;
end = info.indexOf(".");
if (end < 0)
return sContent;
verMinor = info.substring(begin, end);
info = info.substr(end+1);
// сборка
begin = 0;
end = info.indexOf(".");
if (end < 0)
return sContent;
build = info.substring(begin, end);
info = info.substr(end+1);
// ревизия
begin = 0;
end = info.length;
if (end < 0)
return sContent;
revision = info;
// увеличиваем номер
revision++;
var info = verMajor + "." + verMinor + "." + build + "." + revision;
// собираем новый файл
var s = sContent.substring(0, cutBegin) + info + sContent.substring(cutEnd, sContent.length);
return s;
}
// основная программа
function main()
{
var sFileToParse = "..\\..\\Properties\\AssemblyInfo.cs";
// открыть файл
var content = fnLoadContent(sFileToParse);
// увеличить номер ревизии
content = fnIncrementVerInfo(content, "[assembly: AssemblyVersion(\"");
content = fnIncrementVerInfo(content, "[assembly: AssemblyFileVersion(\"");
// Создать объект FileSystemObject.
var myFileSysObj = new ActiveXObject("Scripting.FileSystemObject")
// Создать объект TextStream.
var myTextStream = myFileSysObj.OpenTextFile(sFileToParse, 2, true)
// Записать в файл результат
myTextStream.Write(content);
}
// пуск
main();
|