Composer synchronizer: automatická synchronizace souborů při instalaci & odinstalaci balíčku
- Machy8
- Člen | 59
Poměrně nedávno vydalo Symfony balíček symfony/flex
. Ikdyž
to „neumí nic extra“, tak to přeci jen rozmazlí tím, že programátor
nemusí soubory kopírovat a vytvářet ručně. Jelikož pracuji v Nette a pro
něj nic takového není (nebo o tom alespoň nevím), rozhodl jsem se něco
obdobného vytvořit.
- Balíček: composer-synchronizer/composer-synchronizer
- Dokumentace: https://github.com/…/master/docs
- Příklady konfigurace balíčků: https://github.com/…zer/examples
Jak to funguje
- Řekněme, že si budeme chtít nainstalovat Doctrinu a využijeme k tomu balíčky nettrine/orm, nettrine/migrations a contributte/console.
- U každého balíčku bychom museli vytvářet konfigurační soubor, vytvořit základní nastavení, includovat ho do Nette, přidat binárku pro konzoli atd.
- Pokud by ale v projektu byl přidán composer-synchronizer/composer-synchronizer, tak se při instalaci zkontroluje, zda-li má balíček konfiguraci pro kopírování a vytváření souborů buď přímo u sebe nebo v repozitáři na Githubu. Pakliže konfigurace existuje, tak se popřípadě stáhne a soubory se automaticky nakopírují do příslušných adresářů.
- Programátor už pak jen případně konfiguraci upraví a přidá soubor
composer-synchronizer.neon
vytvořený synchronizerem ve složceapp/config
do souborubootstrap.php
. - Všechno kopírování binárek a konfiguráků tímto odpadá.
Co musím udělat, aby se mi balíčky v projektu synchronizovaly?
- Mít nainstalovaný synchronizer
- Mít přidanou sekci v konfiguráku se zvoleným typem projektu (poslední
verze
nette2
má aliasnette
) - Instalovat balíčky, který obsahují konfiguraci pro zvolený typ projektu a instalovanou verzi balíčku (vždy dvoumístná)
{
"extra": {
"composer-synchronizer": {
"project-type": "nette"
}
}
}
Co musím udělat, aby se balíček synchronizoval?
- Přidat do composer.json souboru konfiguraci s informacemi, co a kam se má kopírovat nebo přidat, pro daný typ projektu.
- Konfiguraci pro balíčky, které nejsou vaše, je možné umístit do repozitáře na Githubu, odkud se bude stahovat (počet stažení konfigurace z Githubu je omezen na IP adresu podle Github Rate Limit).
{
"name": "some/package",
"extra": {
"composer-synchronizer": {
"nette2": {
"resources": {
"extension.neon": "%configDir%/somePackage/",
"webtemp/": "%wwwDir%/webtemp/"
},
"gitignore": [
"%wwwDir%/webtemp/"
],
"includes": [
"somePackage/extension.neon"
]
}
}
}
}
Co to zatím umí…
- Kopírovat soubory i celé adresáře.
- Přidávat a odebírat parametry z hlavního .gitignore v adresáři projektu.
- Přidávat a odebírat cesty ke konfiguračním souborům v soboru
app/config/composer-synchronizer.neon
. - Pokud používáte Nette s upravenou adresářovou strukturou, je možné přepsat placeholdery pro cesty a soubory se následně nakopírují správně.
TODO
- Přemýšlím, jestli při odinstalaci balíčku odebírat nakopírované soubory? Zatím se jen čistí gitignore a odebírají odinstalované závislosti z composer-synchronizer.neon.
- Hodilo by se vám po instalaci balíčku spouštět příkazy jako
chmod
čiexec
?
Budu rád za jakoukoliv připomínku i nápad!
- Marek Bartoš
- Nette Blogger | 1263
Vůbec bych nepoužíval ten repozitář s konfiguracemi a vždy to nechal u balíčku. Kdyby se ten installer začal používat, tak pro tebe bude náročné a spíš nemožné kontrolovat, co ti tam kdo posílá. Což by se ještě dalo, ale problém jsou side effecty. Instalace balíčku změní své chování a přitom to z balíčku vůbec není patrné – nezmění se nic v jeho kódu a nemá žádnou přímou závislost na tom tvém repozitáři.
Zapomeň na wwwDir, je to příliš nette-specific. Drž se unixového standardu a použij název publicDir (symfony v4 je strukturované podle něj)
Zapřemýšlel bych nad tím, zda by nebylo vhodnější místo popisu
v composer.json udělat instalační skript včetně průvodce. My
v contributte máme momentálně jen něco na doplnění konfigurace neonu –
https://github.com/…tte/neonizer
Představuju si to tak, že budu mít instalační třídu, která bude mít
parametry jako publicDir, configDir apod. a bude se mě v průběhu instalace
ptát na jednotlivé parametry vygenerované konfigurace. Bylo by tak možné
při instalaci balíku rovnou nastavit připojení k databázi a přenastavit
výchozí hodnoty – např. ta webtemp directory z příkladu je něco, co
budu téměř jistě chtít měnit a tak nechci. aby se mi výchozí hodnota
zapsala i do gitignore.
Vyřeší se tím i odinstalace – univerzálně to nevyřešíš, často
chci při odinstalaci data ponechat (nebo jsem změnil cestu k nim). Stejně
tak tím vyřešíš příkazy.
A ještě mám dotaz – ještě jsem to nepouštěl, ale máš tam nějak pojištěné třeba to, že smažu vendor a composer.lock? Aby to nekonfigurovalo od znova. Mě napadá použít soubor (composer-synchronizer.lock), do kterého by se zapsalo, co už se spustilo.
Editoval Mabar (4. 5. 2018 15:51)
- Machy8
- Člen | 59
@Mabar
- Když se nainstaluje balíček, v jakékoliv verzi, který má konfiguraci (extra → composer-synchronizer → nette2), tak se po sesynchronizování zapíše jméno balíčku do composer-synchronizer.lock v adresáři projektu a znovu se to synchronizovat nebude. Když se .lock přidá do repozitáře s projektem, tak se při buildu již nic spouštět nebude.
- Při odinstalaci balíčku se jméno balíčku odstraní z locku a při další instalaci se znovu sesynchronizuje.
- Přidám možnost pro vypnutí / zapnutí remote balíčků.
- Přidám i možnost nezamykat zvolené balíčky během vývoje do lock souboru
- Zvážím, jestli nahradit wwwDir za publicDir. Nevím ale, jestli to nebude matoucí. Nette má www adresář, nikoliv public. Ikdyby si někdo wwwDir změnil na cokoliv jiného, tak bude nahrazovat původní cestu k www adresáři a ne k public adresáři.
Editoval Machy8 (5. 5. 2018 0:02)