Workaround pre Composer globálne
David Grudl nedávno písal o rôznych variantách inštalácie Composera. Priznám sa, sprvoti som nerozumel, kde môže pri globálnej inštalácii nastať konflikt, no nakoniec mi to doplo.
V podstate nejde o nič nové a na rovnaký problém môžete naraziť pri vašom projekte. Keď jedna knižnica, ktorú používate (alebo projekt samotný), povedzme A, je závislá na ďalšej, volajme ju B, a iná, napr. C, je tiež závislá na B.
Konflikt nastane keď:
- A potrebuje na svoje fungovanie B, napr. verziu
~1.3 - a C potrebuje taktiž B, no už novú major verziu, napr.
~2.2
To isté sa deje s globálnou inštaláciou, t.j. keď používate composer global require, pretože adresár .composer
je akoby spomínaný projekt, akurát v inom adresári.
Ak chcete používať binárky knižníc globálne tak, aby sa vám to jedného dňa nerozsypalo, je nutné každú nainštalovať izolovane.
To môžete spraviť pomocou composer global create-project.
Nevýhodou je, že nainštalované knižnice nebudú v jednom projekte, a tak nie je možné pridať do $PATH napríklad celý
adresár vendor/bin.
Workaround
Napadlo mi potom úplne jednoduché riešenie. Vytvoríte si nový projekt, v ktorom budú adresáre s jednotlivými knižnicami
- každá vlastne ako separátny projekt. Takto:
tester/
tester/composer.json
phpunit/
phpunit/composer.json
...
install.shV tester/composer.json bude napr.:
{
"require": {
"nette/tester": "~1.3"
}
}
Následne pridáte jednoduchý skript install.sh, ktorý jednotlivé projekty nainštaluje pomocou Composera a vytvorí
symlinky do /usr/local/bin:
find . -type d ! -name ".*" -depth 1 -exec composer install -d {} \;
find `pwd` -path "*/vendor/bin/*" -exec ln -s {} /usr/local/bin \;
A je to. Ba Dum Tss.
PS: Nie, nemohol som len spustiť skript install.sh v adresári .composer, pretože create-project je pre začatie
nového projektu a nevytvára vendor/bin, kde by boli jeho vlastné binárky.
Sample kód nájdete na Githube.