GIT post-merge hook за комбиниране и minify-ване на JavaScript
От известно време използвам един малък script на GIT post-merge hook за един от проектите си (M Simple Nav).
Днес го доработих, така че да бъде малко по-гъвкав. Реших и да го споделя с хората, които също имат проекти под GIT. С него може лесно да се minify-ват всички JS файлове в един:
Начинът, по който работи script-а е, че първо взима името на branch-а в променлива:
current_branch="$(git rev-parse --abbrev-ref HEAD)";
После се прави проверка кой е този branch. За моя проект ми трябва този hook да се изпълни, единствено, ако merge-вам нещо към production:
if [[ $current_branch == 'production' ]]; then
Чрез следващия ред намирам всички файлове в папка "js", чието име завършва на ".js" и списъкът с имена на файлове подавам към cat
функцията, която просто събира всички файлове в един (при мене е "js/combined.js").
find js -name *.js | xargs cat > js/combined.js
След това посредством CURL изпращам съдържанието на този файл към online service за минифициране и резултата записвам в "js/combined.min.js". После изтривам не-минифицирания "js/combined.js", тъй като повече нямам нужда от него.
Тъй като се използва online service трябва да сте сигурни, че при merge-ването имате интернет. В противен случай стъпката няма да се изпълни правилно.
Бихте могли вместо с CURL към външен service да си инсталирате команда, която да минифицира JavaScript-а. Аз предпочитам този service, тъй като резултатът освен minify-нат е и GZIP-нат (компресиран).
За финал правя нов автоматичен commit с новата версия на minify-натия JS.
Според мен подходът ти е напълно погрешен. Причините са няколко:
– изпълняваш команда към външна услуга
* Какво ще се случи ако от javascript-minifier.com пуснат експлойт вместо съдържанието на твоя файл. Нямаш никакви проверки за това.
* Ако javascript-minifier.com спре поради някаква причина, няма да можеш да пуснеш нова версия на файла ти или тя ще е с невалидно съдържание
– curl е по-бавен от решението по-долу
Вместо това:
– изтегли yuicompressor
– build-вай локално (пример: java -jar yuicompressor-2.4.8.jar source.js -o source.js –charset utf-8)
– push-вай вече build-нати файлове
– използвай GZIP компресия на уеб сървъра ти
Съгласен съм, че като цяло разчитането на външен service не е добро, поради причините, които си изтъкнал: няма гаранция, че винаги ще работи; възможно е полученият резултат да не е точно каквото сме очаквали. Така че, ако човек предпочита – винаги може да го направи с локална библиотека.
Аз лично винаги тествам резултатът, преди да кача файловете от „production“ branch-а си live и харесвам този service, тъй като все още се срещат сървъри без модул, който да GZIP-ва файлове преди сервирането им.
В случаят, това на което трябва да се наблегне, не е javascript-minifier.com service-а, колкото идеята за автоматично конкатениране и компресиране на JS файлове от даден проект и push-ването им в отделен branch. Какво е мнението ти за това?