Tuesday, June 19, 2007

Storing revision information using Windows Script Hosting

Вот возникла задача в ASP.NET приложении отображать номер ревизии, дату когда происходил билд. Не знаю, возможно есть и более простые решения, но так, как я их не нашёл, решил написать простенький JScript код, который будет выполняться WScript'ом как prebuild-евент проекте.

Вот какой скриптик получился:

var ws = new ActiveXObject("Wscript.Shell");
var path = "";
if (WScript.Arguments.length == 1) {
path = WScript.Arguments(0);
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
var oSvn = ws.Exec("svn info");
while (oSvn.Status == 0)
{
WScript.Sleep(100);
}
var vers = oSvn.StdOut.ReadAll();
var regex = new RegExp("Revision: (\\d+)","m");
var revArr = regex.exec(vers);
if (revArr==null) {
WScript.Echo("No revision found!");
} else {
rev = revArr[1];
var templateFile = fso.OpenTextFile(path+"ProductVersion.cs.template", 1);
var template = templateFile.ReadAll();
var regex2 = new RegExp("\\$Revision\\$","gm");
template = template.replace(regex2,rev);
var regex_date = new RegExp("\\$Date\\$","gm");
var date = new Date();
template = template.replace(regex_date,date.toGMTString());
var result = fso.CreateTextFile(path+"ProductVersion.cs", true);
result.Write(template);
result.Close();
}

Он фактически на основе темплейта ProductVersion.cs.template создаёт файлик ProductVersion.cs, в котором заменяються $Revision$ текущей ревизией, а $Date$ датой.


Тут разве что стоит отметить два "но":



  1. Скрипт должен запускаться в том месте, где доступна информация о ревизии (+ рядом должен лежать файлик темплейта). По этому, следует перед вызовом скрипта (через wscript/cscript) в prebuild добавить cd $(ProjectDir)
  2. Так, как проект ASP.NET 2.0 не имеет prebuild/postbuild евентов (во всяком случае я не нашёл), нужно иметь другой проект, который будет экспортить инфу о ревизии.

Кстати, почему-то подумалось: решение чем-то похоже на решение с "генераторами", про которое я недавно писал.

6 comments:

Iv said...
This comment has been removed by the author.
Iv said...

prebuild и postbuild хоть и отсутствует в GUI, но можно выдрать из *.sln файла стандартного проекта и вставить в твой проект на асп.

Olostan said...

Насколько я знаю prebuild/postbuild находятся в csproj, а не в солюшене.

Для asp.net проекта нет файла проекта.

Пока не нашёл способа как в солюшен можно засунуть аналогию:

<PreBuildEvent>cd $(ProjectDir)
wscript ProductVersionBuilder.js</PreBuildEvent>



Был бы очень благодарен за подобную информацию. Идея просто отличная.

Пока я знаю ещё один вариант через MSBuild, но он имеет свои ограничения.

Iv said...

точно спутал, с *.csproj, в общем так: создал новое веб-приложение, потом добавил в него еще одно веб-приложение, первоначальную болванку удалил, открыл появившийся файл проекта, туда добавил, то что до этого выдрал из стандартного вин-проекта:
< PropertyGroup >
< PreBuildEvent>
echo common
< PreBuildEvent >
< PropertyGroup>

таким вот обходным путем все получилось. Вроде это как-то проще раньше делал, но уже давно не создавал с нуля веб-проекты, поэтому забыть успел.

Olostan said...

Вах. Спасибо. Попробую как-то вклинить в готовый проект.

hosting kniga said...
This comment has been removed by a blog administrator.