TFS Build 2010 - минимизируйте JS / CSS перед развертыванием

У меня есть минификатор Ajax, чтобы минимизировать некоторые файлы JS и CSS в процессе сборки / упаковки / развертывания. Это отличный инструмент, который делает именно то, что нам нужно. Однако интегрировать это в наш процесс сборки / развертывания оказывается очень сложно.

В идеале мы хотим запускать этот инструмент только тогда, когда мы выполняем одну из наших сборок TFS 2010 (т. Е. НЕ локальную (Ctrl + Shift + B jobbie) сборку на машине разработчика. ). Кроме того, мы хотим заменить наши текущие «неминифицированные» файлы в этом сценарии минифицированными (то есть с тем же именем файла), а не загружать дополнительные файлы с именем «.min.js» и т. Д.

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

Это наиболее близкое обсуждение того, чего я пытаюсь достичь: Microsoft Ajax Minifier - Рабочий процесс TFS 2010 - AjaxMin в сборке TFS

Я верю, что мне понадобится пользовательское действие кода в рабочем процессе сборки, но я понятия не имею, как создать его для решения этой проблемы. Может ли кто-нибудь пролить свет на процесс, позволяющий минимизировать перед развертыванием?


person harman_kardon    schedule 20.09.2011    source источник


Ответы (3)


Хорошо - благодаря этим ответам и большому количеству исследований ... я пришел к следующему решению :)

Начиная с действий настраиваемого кода, я попытался запустить минификатор из кода 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

Выполнить это как пользовательское действие кода, безусловно, можно, но вам придется приложить некоторые усилия. Мое предложение было бы:

  1. Сначала ознакомьтесь с блогом по настройке TFS 2010 от Эвальда Хофмана по адресу http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx, чтобы узнать о создании пользовательских действий.
  2. Затем взгляните на http://www.ewaldhofman.nl/post/2010/06/01/Customize-Team-Build-2010-e28093-Part-10-Include-Version-Number-in-the-Build-Number.aspx из той же серии, чтобы реализовать механизм поиска всех файлов, соответствующих определенному шаблону. В этом примере индексируются файлы assemblyInfo.cs и изменяется их содержимое. Замените это поиском ваших файлов * .js.
  3. Освободите возможности Ajax Minifier при выборе файла и замените исходный файл уменьшенным.
  4. Создайте действие, включите его в качестве шага в шаблон процесса сборки, который вы используете в TFS 2010 (также описанный в тех же сообщениях в блоге), и настройте его так, чтобы оно вам понравилось.

В качестве альтернативы вы можете попросить автора сообщения, которое вы включили в свой вопрос, поделиться с нами деятельностью Minifier TFS, которую он создал :-)

Пожалуйста, дайте мне знать, как это работает для вас.

person kroonwijk    schedule 20.09.2011
comment
Я бы с радостью поделился ... но я сделал это для работы. Но я перепишу его для вас, ребята (и для расширений сообщества TFS). Какое для этого лучшее место? Git? PasteBin? - person Issa Fram; 21.09.2011

Вам необходимо реализовать Invoke Process Activity, чтобы Minifier запускался во время сборки TFS.

Для этой цели вам также необходимо установить минификатор на сервере (ах), выполняющем ваши сборки, так называемые агенты сборки. Делая это, вы гарантируете, что Minifier будет вызываться только во время ваших TFS-сборок (в отличие от локальных VS-сборок).

Чтобы переименовать сгенерированные файлы вывода (* .min.js), вам необходимо реализовать другое настраиваемое действие только для этого. Перезапись ваших зарегистрированных файлов требует, чтобы вы сначала сделали их доступными для записи, это означает еще одно настраиваемое действие (я предоставил в другой ответ, фрагмент для этого).

Вся хореография:
Вызов Minifier с помощью InvokeProcess -> Сделать отметку в файлах доступной для записи -> Перезапись отмечена в файлах с переименованными уменьшенными файлами .

Правильный способ сделать это при сборке TFS - обернуть их в Sequence.

Хорошее вводное сообщение в блоге о том, как реализовать процесс вызова, можно найти здесь.
Я также нашел series от Э. Хофмана.

person pantelif    schedule 20.09.2011
comment
Спасибо - это указывало мне в правильном направлении. Еще один быстрый вопрос - как мне на самом деле получить путь к файлам .js и .css, которые я хочу минимизировать, поскольку они поступают непосредственно из системы управления версиями и находятся во временной рабочей области на агенте сборки, это правильно? - person harman_kardon; 21.09.2011
comment
Ознакомьтесь с набором инструментов для действий по сборке Team Foundation. Там вы можете найти ConvertWorkspaceItem и ConvertWorkspaceItems, которые принимают в качестве входных данных маркировку исходного элемента управления для файла (ов) ($ / ...) и возвращают текущий фактический путь к файлу (ам) - person pantelif; 21.09.2011
comment
не вызывать ... не удалось. этот вопрос, который вы указали в своем исходном посте, принадлежит мне. свяжитесь со мной по электронной почте. я покажу вам, как я это сделал - person Issa Fram; 21.09.2011
comment
@IssaFram: не лучше ли поделиться своим решением с остальными? Я был бы полностью заинтересован! - person pantelif; 21.09.2011
comment
Я бы с радостью поделился ... но я сделал это для работы. Но я перепишу его для вас, ребята (и для расширений сообщества TFS). Какое для этого лучшее место? Git? PasteBin? - person Issa Fram; 21.09.2011