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.

2 Отговори на “GIT post-merge hook за комбиниране и minify-ване на JavaScript”

  1. Според мен подходът ти е напълно погрешен. Причините са няколко:

    – изпълняваш команда към външна услуга
    * Какво ще се случи ако от 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. Какво е мнението ти за това?

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.