Хорошо - благодаря этим ответам и большому количеству исследований ... я пришел к следующему решению :)
Начиная с действий настраиваемого кода, я попытался запустить минификатор из кода C #, а затем вызвал действие как часть рабочего процесса. Это не сработало, поскольку версия минификатора .dll предоставляет несколько методов для сжатия файлов .js и .css, а затем заставляет вас открыть какой-либо StreamWriter и перезаписать файл со сжатой строкой, возвращенной из метод (если вы хотите перезаписать существующие файлы). Довольно интенсивно открывать и закрывать файлы в течение всего дня, поэтому мне это решение не очень понравилось. Использование класса процесса для запуска .exe с включенной опцией -clobber (для перезаписи файлов) также не является идеальным и дает некоторые странные результаты (некорректное минимизирование файлов и запись мусора в заголовок каждого файла).
Итак, вы спросите, решение, на котором я остановился, заключалось в том, чтобы написать сценарий PowerShell (начало которого я получил из здесь, который я затем немного изменил, чтобы принять параметр командной строки, который будет корневой папкой вашего проекта.Сценарий рекурсивно просматривает каждый файл (и файлы каждого подкаталога) и минимизирует файлы .css и. js внутри. Довольно аккуратно. Его костяк выглядит примерно так:
$ScriptDirectory = $args[0]
Write-Host "Validating directory parameter: $ScriptDirectory"
Write-Host ""
if ((Test-Path -path $ScriptDirectory) -ne $True)
{
#Throw an error of some kind (the parameter passed in isn't a valid directory).
}
$Minifier = “C:\Program Files\Microsoft\Microsoft Ajax Minifier 4\AjaxMin.exe”
get-childitem $ScriptDirectory -recurse -force -include *.js, *.css -exclude *.min.js, *.min.css | foreach-object {&$Minifier $_.FullName -out $_.FullName -clobber}
Итак, мы просматриваем каждый дочерний элемент корневой папки с расширением .js или .css (игнорируя расширения .min. *, Поскольку они уже были сжаты).
В TFS все, что нам нужно сделать, это добавить шаг InvokeProcess
к выполнить сценарий PowerShell в TFS. Вы можете передать свой параметр в (каталог для начала минификации), используя свойство Arguments действия InvokeProcess.
Чтобы получить каталог, который сборка TFS использует для компиляции вашего кода перед его выпуском (временная рабочая область, если хотите), вы можете использовать переменную SourcesDirectory, доступную вам в последовательности запуска от агента сборки. Это место, где ваши файлы компилируются и упаковываются в процессе сборки TFS, поэтому все, что здесь минифицировано, попадет в окончательный пакет развертывания.
P.S - SourcesDirectory находится довольно высоко - вы, возможно, не захотите детализировать весь путь оттуда, чтобы добраться до ваших файлов .js и .css, поэтому вам нужно указать что-то вроде:
SourcesDirectory + "/" + "MyProjectFolder/Scripts"
Убедитесь, что вы добавили этот шаг InvokeProcess до того, как ваш код будет развернут в рабочем процессе, и привет, вы получите минифицированные файлы .js и .css, которые сохранят исходные имена файлов только как часть сборки TFS, а не как локальную. .
Большое спасибо всем, кто ответил и указал мне в правильном направлении. Надеюсь, это кому-то поможет!
person
harman_kardon
schedule
22.09.2011