Git a composer a pararelní vývoj Addonů
- LeonardoCA
- Člen | 296
Nemám skoro žádnou praktickou zkušenost s composerem, proto se chci zeptat, dá-li se smysluplně zapojit do následujícího workflow.
Má představa je vyvíjet veškeré univerzálnější moduly jako Nette/Addony, s tím že budou po dobu několika měsíců v rozpracovaném stádiu, zároveň testované i laděné v několika starších a nových projektech. Na něčem budu pracovat sám, na něčem bude pracovat více lidí
Struktůra zhruba následující:
- OldProject1
- AddOn1
- AddOn4
- AddOn5
- OldProject2
- AddOn1
- AddOn2
- AddOn4
- NewProject1
- AddOn2
- AddOn3
- NewProject2
- AddOn1
- AddOn2
- AddOn3
- AddOn4
- AddOn5
- NewProject3
- AddOn1
- AddOn3
- AddOn4
- AddOn5
- AddOn1
- AddOn2
- AddOn3
- AddOn4
- AddOn5
- SandboxAddOn1
- AddOn1
- SandboxAddOn2
- AddOn2
- SandboxAddOn3
- AddOn3
- (AddOn1, AddOn2)
- SandboxAddOn4
- AddOn4
- SandboxAddOn5
- AddOn5
- (AddOn1, AddOn2, AddOn3) // volitelně závíslé addony
Chci to řešit pomocí Git submodulů. Hodí se i v této fázi používat composer s git repository? Zvlášťe když ze začátku je předpoklad commitů/updatů jednoho addonu několikrát denně?
- Filip Procházka
- Moderator | 4668
Tak si nastavíš závisloti na @dev
verzi toho balíčku a
vždy zavoláš $ composer update
.
Issue, která by tě mohla zajímat: https://github.com/…r/issues/601
Editoval HosipLan (11. 8. 2012 12:48)
- LeonardoCA
- Člen | 296
Hosiplan: dík za tip.
Co mě ještě zajímá composer update tak updatuje automaticky všechny balíčky? A dá se specifikovat, že chci updatovat třeba jen jeden balíček? A některý zrovna nechci updatovat? Nebo takový případ budu řešit gitem?
Chápu to správně, že tedy commitovat změny budu přes git a updatovat budu přes composer? Můžu to libovolně kombinovat? Nerozhodí to git?
Tyhle souvislosti mi ještě nejsou úplně jasné …
V tom issue na které odkazuješ navíc píšeš, že používání git submodules bylo annoying – mohl bys rozvést důvody? Doladil sis nějak raději řešení se symlinky?
Zvažuju ještě možnost, vykašlat se v tomto stádiu na composer a řešit vše raději přes git, ale nevím co bude lepší …
Editoval LeonardoCA (11. 8. 2012 16:32)
- Filip Procházka
- Moderator | 4668
Já to teď řeším tak, že když vyvíjím, tak dám jednou
$ composer update
, smažu ty složky u projektů, které vyvíjím
taky a pak místo nich udělám symlinky. Samozřejmě si musím dávat bacha a
nesmím zavolat update
, když tam mám ty symlinky. Ale zase
nemusím nic řešit, prostě je všechno realtime.
Je to v pohodě použitelné, protože závislosti si nastavíš jednou a pak programuješ třeba týdny, než potřebuješ zase něco měnit v nastavení závislostí.
Kdybych zavolal update nad tím repozitářem, tak ono to většinou nic neudělá. Composer se snaží nenechat tě zmršit ty repozitáře, ale je to dost „vratké“. Prostě to chce ty linky.
Ale na to linkování se chystám. Jen to prostě není priorita číslo jedna.
Co mě ještě zajímá composer update tak updatuje automaticky všechny balíčky? A dá se specifikovat, že chci updatovat třeba jen jeden balíček? A některý zrovna nechci updatovat? Nebo takový případ budu řešit gitem?
$ composer update
ti prostě aktualizuje v tom aktuálním
projektu závislosti. Prostě tam natahá ty nejnovější, jaké mu
povolíš.
Git submoduly jsou hrozně bolestivé a složité. Fakt je nedoporučuju. Composer je na úplně jiné úrovni inteligence, použitelnosti i možností jak s tím kouzlit.
- LeonardoCA
- Člen | 296
Chápu pro jednotlivce s více projekty, které si sám udržuje je by to se symlinky bylo v pohodě řešení. Akorát s tím že na dvou projektech budou další minimálně 3 programátoři, tak to musí jít přes git.
Vždy je riziko, že úprava addonu rozbije něco v jiném projektu a tam zrovna nebude čas a chuť to hned řešit…
Budu si muset ještě něco vygooglit k těm submodulům, proč s tím jsou problémy.
Ještě mě napadá řešení adresář addonů úplně ignorovat v hlavním git repozitáři a mít v něm v podadresářích několik samostatných git repozitářů, které by se comittovaly zcela nezávisle. A balíčky pro composer by se dělaly až pro release verze addonů a release verze celé aplikace by se už i na staging řešila jen přes composer a odpovídající verze addonů…
Co si myslíš o takovém řešení? Pro vývoj několik nezávislých projektů ve společné adresářové struktůře. Pro deployment by se pomocí composeru spojily do jednoho projektu…
- LeonardoCA
- Člen | 296
Vypadá to, že k podobnému řešení došli i tady:
http://blog.appfog.com/…-submodules/
a důvody proč nepoužívat submodules jsem našel hned:
http://ayende.com/…t-submodules
editováno:
a ještě jeden článek k tématu:
http://codingkilledthecat.wordpress.com/…-submodules/
ani řešení googlu s Repo pro Android se mi moc nelíbí, takže pro směr
jsem se už rozhodl, teď to jen vyzkoušet a vyladit…
Editoval LeonardoCA (11. 8. 2012 20:15)
- Filip Procházka
- Moderator | 4668
Předně ti raději zdůrazním jednu důležitou věc. Composer umí
pracovat čistě nad git repozitáři. Ty mu řekneš, že chceš vývojovou
verzi a on ti při každém $ composer update
stáhne nové
commity. Tohle je úplně v pohodě funkční řešení.
Ještě mě napadá řešení adresář addonů úplně ignorovat v hlavním git repozitáři a mít v něm v podadresářích několik samostatných git repozitářů, které by se comittovaly zcela nezávisle. A balíčky pro composer by se dělaly až pro release verze addonů a release verze celé aplikace by se už i na staging řešila jen přes composer a odpovídající verze addonů…
Adresář s knihovnami, které instaluje composer nesmíš
commitovat do projektu! To jsou oddělené projekty a composer je skládá
dohromady. Ty musíš mít složku vendors
v
.gitignore
.
Balíčkem se chápe jakákoliv aplikace, knihovna, nebo rozšíření. Tebe
jediné co zajímá, tak na jaké verzi běžíš. Můžete mít v pohodě
několik samostatných repozitářů, commitovat do nich a vždy spustit jenom
$ composer update
.
- LeonardoCA
- Člen | 296
Adresář vendors bude v .gitgnore, to je jasné.
Poslední věc co ještě není jasné, budu mít addony/adresáře stažené composerem s dev verze mohu je potom normálně jednotlivě commitovat do gitu?
Tedy když bude ve vendors např:
vendors\Lxo\Application\UI\Bootstrap
vendors\Lxo\Application\UI\Datatables
Budou tyto adresáře obsahovat jen aktuální verzi addonu nebo kompletní git repozitář Addonu aby se s tím dalo dál pracovat? Takto by mi to pro vývoj dávalo smysl…
Editoval LeonardoCA (11. 8. 2012 21:06)
- Filip Procházka
- Moderator | 4668
Pokud pracuješ s development verzí balíčku, která je verzována v gitu, tak ano. Composer ti naklonuje kompletní repozitář. Když pak dáš update, pullne změny a checkoutne co po něm chceš.
- LeonardoCA
- Člen | 296
super, díky za konzultaci :) takto si myslím to bude přesně splňovat mou představu
- bazo
- Člen | 620
LeonardoCA napsal(a):
Hosiplan: dík za tip.
Co mě ještě zajímá composer update tak updatuje automaticky všechny balíčky? A dá se specifikovat, že chci updatovat třeba jen jeden balíček? A některý zrovna nechci updatovat? Nebo takový případ budu řešit gitem?
update jedneho balicka: composer update vendor/balicek
- gawan
- Člen | 110
Rád by som sa opýtal ako správne robiť (alebo ako vy robíte) deploy s git a composerom. @HosipLan písal, že externé knižnice sa nesmú commitovať do hlavného projektu.
Potom ale pri deploy na production musím zavolať
composer update
a čo ak niektorý z externých zdrojov je off
(už sa to stalo aj s githubom) alebo nejaký „profík“ zmaže nejaký
commit tag, lebo tam našiel hotfix (nebudem radšej menovať ;-) a jednoducho
mi na production z akéhokoľvek dôvodu nezbehne composer update
a zhodím production, čo potom?
Preto sa mi zdá bezpečnejšie mať všetky externé knižnice natvrdo skopírované v hlavnom projekte a pri deploy to nikdy nemôže zlyhať. Ako to riešite?
- Filip Procházka
- Moderator | 4668
Nejenom ty to tak řešíš. Doporučuje to tak dokumentace Composeru. Vždy
commitnout pouze composer.lock
a composer pak nainstaluje ty
správné verze.
- Filip Procházka
- Moderator | 4668
V žádném případě necommitovat adresář vendors. To to tam raději nahrát i s ním, ale v žádném případě necommitovat.