TFS Build 2010 - минимизируйте JS / CSS перед развертыванием - PullRequest
1 голос
/ 20 сентября 2011

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 22 сентября 2011

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

Начиная с операций с пользовательским кодом, я попытался запустить минификатор из кода 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, доступную вам в последовательности Run On Agent сборки. Это место, где ваши файлы компилируются и упаковываются в процессе сборки TFS, поэтому все, что здесь будет минимизировано, попадет в окончательный пакет развертывания.

P.S. Каталог SourcesDirectory достаточно высок - вам, возможно, не захочется проходить весь путь оттуда, чтобы добраться до ваших файлов .js и .css, поэтому вам нужно указать что-то вроде:

SourcesDirectory + "/" + "MyProjectFolder/Scripts"

Убедитесь, что вы добавили этот шаг InvokeProcess до того, как ваш код был развернут в рабочем процессе, и вы должны минимизировать файлы .js и .css, которые сохраняют исходные имена файлов только как часть сборки TFS, а не местный.

Большое спасибо всем, кто ответил и указал мне правильное направление. Я надеюсь, что это поможет кому-то на этом пути!

1 голос
/ 20 сентября 2011

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

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

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

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

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

Хорошее вступительное сообщение в блоге о том, как реализовать Invoke Process, можно найти здесь .
Я также нашел серию Э.Хофмана изреальная стоимость.

1 голос
/ 20 сентября 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: -)

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

...