Niekedy pri práci na PHP projekte, kde existuje veľa vetiev potenciálne s nekompatibilnými balíkmi, môže byť otravné stále pamätať na manuálne spúšťanie composer i alebo akejkoľvek docker alternatívy či aliasu. Po zabudnutí sa objavujú chybové hlásenia, ktoré zanášajú logy, a každý to sleduje, pričom sa zbytočne stráca čas.

Skúsil som upraviť túto Stack Overflow odpoveď, aby som zistil, či by to mohlo byť pohodlne automatizované cez git hooky. Pre záznam tu sú pôvodné kroky z odpovede. Začnite vytvorením post-checkout git hooku s príznakom spustiteľnosti:

touch .git/hooks/post-checkout
chmod u+x .git/hooks/post-checkout

Vložte tam tento obsah:

#!/bin/bash

set -e

printf '\npost-checkout hook\n\n'

prevHEAD=$1
newHEAD=$2
checkoutType=$3

[[ $checkoutType == 1 ]] && checkoutType='branch' ||
                            checkoutType='file' ;

echo 'Checkout type: '$checkoutType
echo '    prev HEAD: '`git name-rev --name-only $prevHEAD`
echo '     new HEAD: '`git name-rev --name-only $newHEAD`

Toto ma aspoň nasmerovalo. Teraz to transformujme tak, aby skutočne spúšťalo composer install pri checkloute inej vetvy. Všimnite si, že nepotrebujeme skutočne kontrolovať, či bol checknutý súbor alebo skutočná vetva, pretože checkovanie súboru nie je príliš časté a tiež spúšťanie composera je navrhnuté tak, aby nespôsobovalo problémy:

#!/bin/bash

set -e

prevHEAD=$1
newHEAD=$2

if [ "$newHEAD" != "$prevHEAD" ]; then
    composer i
fi

Teraz otestujte s git checkout somebranch. Funguje? Áno. Pohodlné? Ani nie! Hlavný problém je, že blokuje terminál, kým sa composer inštaluje. Zapracujme radu z ďalšej odpovede vysvetľujúcej, ako spustiť dlhotrvajúci príkaz na pozadí:

long-running-command >&- 2>&- &

Alternatívne to isté možno urobiť nasledovne — vyberte si syntax, ktorá vám vyhovuje:

long-running-command >/dev/null 2>&1 &

Vyššie uvedené funguje tak, že presmeruje stderr aj stdout do zabudnutia a pridá & na koniec, čo umiestni príkaz na pozadie. Tu je finálny skript:

#!/bin/bash

set -e

prevHEAD=$1
newHEAD=$2

if [ "$newHEAD" != "$prevHEAD" ]; then
    printf "Post-checkout 'composer install' hook active.\n"
    composer i >/dev/null 2>&1 &
fi

Teraz použite git checkout - na jednoduché prepínanie tam a späť a sledujte procesy. Mali by ste byť schopní vidieť aspoň krátky nárast využitia CPU po každom checkloute:

$ git checkout -
Switched to branch 'somebranch'
Post-checkout 'composer install' hook active.
$ git checkout -
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
Post-checkout 'composer install' hook active.

Užívajte!

Odkazy #