Rozdělení Git repositáře na menší kusy
- VeN
- Člen | 46
Ahoj, chci si Nette repositář přidat do svého repositáře jako submodul, ale narážím na překážky, které pramení z toho, jak je repositář poskládaný. Je v něm všechno, včetně examplů, skeletonu a podobně. Když si tedy přidám Nette repositář jako submodul a pustím na něho robot loader, robot loader se ukončí s tím, že našel kolizní názvy tříd.
Git bohužel neumožňuje naklonovat pouze podadresář z jiného repositáře, vždy musím vzít repositář celý. Situace by se ale změnila, kdyby existoval samostatný repositář s třídami frameworku a testy (tedy nějaký core – via Ondřej Mirtes) a zbytek (example, skeleton) by byl v jiném repositáři. Nad tím by byl postaven superrepositář, který by v podstatě vypadal jako stávající repositář, akorát by byl složený ze submodulů (core, example, skeleton…). Co na to říkáte, je tahle představa realizovatelná.
Nemyslím si, že bychom byli jediní, kteří řeší tento problém. Jakým způsobem vkládáte Nette framework ke svým aplikacím vy?
- Šaman
- Člen | 2662
Ahoj, do GITu zatím moc nevidím, ve firmě je nařízené SVN.
Takže jenom odpovím na druhou otázku – normálně Nette nakopíruji do LIBS. K čemu (ji, ho, to?) přidávat z repozitáře? Docela bych se bál – jakákoliv nestoprocentně zpětně kompatibilní úprava Nette ti pak schodí projekt. Není jich moc, ale občas se taková najde. To radši aktualizuji ručně, pak otestuji a pak zaktualizuji ve svém repozitáři ke konkrétnímu projektu. Různé projekty nám běží na různých verzích Nette, podle toho na jaké verzi byly postaveny a odladěny. A při nějakém větším zásahu do kódů projektu zkusím použít aktuální Nette a když to projde, tak to tak nechám..
- srigi
- Nette Blogger | 558
VeN napsal(a):
Git bohužel neumožňuje naklonovat pouze podadresář z jiného repositáře, vždy musím vzít repositář celý.
Tato vlastnost ma na GIT tiez s***. Za mna +1, lebo rad by som Nette na devel masine updatoval pomocou GITu, cital si logy, checkoval diff a pod. Ten stuff okolo mi v mojom poole libiek strasne vadi.
Momentalne to riesim tak, ze som si napisal skript, ktoremu predhodim zazipovany nightly build a ten uz obsah zipu vseliako prekopiruje/prebali a nasymlinkuje do mojho poolu s libkami. Samozrejme to vytvori zalohy a skomprimuje.
Je to take polovicate riesenie, nedava to vobec eleganciu VCS a hlavne nemozem na systemovej urovni sledovat zmeny,
Editoval srigi (22. 9. 2010 16:07)
- David Grudl
- Nette Core | 8227
V těch submodulech se nevyznám. Napiště mi tu prosím základní princip a provedení, jak by se to mělo udělat.
- VeN
- Člen | 46
Vezmu jednoduchý případ, kdy budou existovat tři repositáře.
- nette
- nette-examples
- nette-skeleton
Všechno to jsou oddělené repositáře. V repositáři nette si přidáme dva submoduly se zbylými dvěmi repositáři:
$ git clone https://github.com/nette/nette.git nette
$ cd nette
$ git submodule add https://github.com/nette/nette-examples.git examples
$ git submodule add https://github.com/nette/nette-skeleton.git skeleton
$ git ci -m 'Skeleton a examples jako submoduly.'
Nyní máme v hlavním repositáři nette vytvořeny dva submoduly z repositářů nette-examples a nette-skeleton. V rámci submodulu můžeme pracovat stejně jako v samosteném repositáři. Pokud v něm něco změníme a commitneme, v hlavním repositáři se objeví změna ukazatele na verzi (klasický hash) submodulu. Superrepositář si drží pouze hashe na verze, ve kterých má submoduly.
Pokud bychom chtěli oddělený repositář pouze se třídami a testy, tak bychom vzali současný adresář Nette a adresář tests ze současného repositáře. Z těchto dvou bychom založili repositář nový, který by měl následující strukturu:
nette-core - Nette - Application
| - Caching
| - ...
|
- tests - ...
Lépe by to asi udělat nešlo, testy by měly zůstat u svých tříd. To kazí myšlenku samostatného Nette adresáře s frameworkem, ale nic lepšího mě nenapadá. Tohle jsem trochu nedomyslel. Druhý repositář (nette) by pak zahrnoval zbytek adresářů s tím, že by měl repositář nette-core jako submodul, stejně jak jsem to ukazoval výše. Pouze by musel být vložený opět jako nějaký adresář.
Když se na to tak koukám, tak by možná stačilo vyhodit examples a skeleton do oddělených repositářů a vložit je do nette repositáře jako submoduly, jak jsem ukazoval na začátku. Při vložení nette do aplikací přes submodul by to nenačítalo soubory ze submodulů nette-examples a nette-skeleton dokud by si to člověk nevyžádal, takže by se v aplikacím nemotaly.
- pekelnik
- Člen | 462
Navrhuju aby místo adresáře skeleton v „hlavním repozitáři“ vzniknul repozitář nette-sandbox který by jako modul měl respozitář nette-libs a vice versa…
Celkem by bylo 9 menších repozitářů (nette, nette-examples, nette-extras, nette-libs, nette-sandbox, nette-tests, nette-tools, nette-api a nette-docs)
Detail repozitářů nette a nette-sandbox by mohl být zhruba tentoc:
nette
Hlavní repozitář Nette Framework se skládá z modulů:
- libs/ (repo: nette-libs) – to co je teď v hlavním repo v adresáři Nette
- examples/ (repo: nette-examples) – příklady
- extras/ (repo: nette-extras) – plužiny od továrního týmu ;)
- tests/ (repo: nette-tests) – testy
- tools/ (repo: nette-tools) – nástroje (requirements checker etc.)
- license.txt
- readme.txt
nette-sandbox
Fungující aplikace – pískoviště
Stačí rozbalit a můžeš si hrát. Obsah tak jak je teď ve skeletonu.
- app/
- document_root/
- libs/
- Nette/ ( -> modul z repozitáře nette-libs)
nette-libs
Nette Framework
- Application/
- Caching/
- …
Obsah repozitářů nette-examples, nette-extras, nette-tests i nette-tools je nasnadě. Obsah nette-api a nette-docs jsem nepromýšlel – doposavat to stejně v gitu není pokud vím…
Takovéto řešení má dvě výhody:
1. Snadné použití pískoviště
Sandbox (nebo chcete-li skeleton) jako takový stačí skutečně rozbalit a je připraven k použití… nic se nemusí nikam kopírovat apod.
Příklad: „Nahození“ nového projektu pomocí sandboxu:
git clone https://github.com/nette/nette-sandbox.git /var/www/<project>
2. Pružný hlavní repozitář
Hlavní repozitář je sestaven z menších repozitářů, které je možné libovolně kombinovat.
Do projektu lze jednoduše přidat jako git submodule pouze repozitář nette-libs.
$ git submodule add https://github.com/nette/nette-libs.git libs/Nette
Dále je možné jednoduše přidělovat oprávnění pro jednotlivé
repozitáře.
Například si dovedu představit že do repozitáře s příklady
nette-examples by mohlo mít práva víc lidí než do
repozitáře nette-libs.
Co myslíte?
Edit: small typos
Editoval pekelnik (29. 9. 2010 15:34)
- VeN
- Člen | 46
Já to řeším stahnutím submodulů do libs_all a jejich přilinkování do libs.
Ano, ale jakmile to budeš muset nastavovat na několika produkčních serverech, tak zjistíš, že je to děsně otravné. Chce to mít možnost deployovat aplikaci na pár příkazů, aby člověk nemusel neustále říkat: „Tohle si stáhni támhle a teď ještě tohle sem přilinkuj a pak už ti zbývá jenom tohleto.“
- Patrik Votoček
- Člen | 2221
Mě je to ve výsledku jedno protože si stejně raději stáhnu balík než klonovat „submodul“. Protože v balíku nemám ten balast pro PHP 5.2 a mám tam informace o buildu.
- Patrik Votoček
- Člen | 2221
@pekelnik: Tak aplikaci mam samozrejme v GITu. jen v tom gitu nemam submodul Nette ale normalne natvrdo soubory. Když nebude OK vrátím se jednoduše na předchozí revizi.
- repli2dev
- Člen | 57
VeN napsal(a):
Já to řeším stahnutím submodulů do libs_all a jejich přilinkování do libs.
Ano, ale jakmile to budeš muset nastavovat na několika produkčních serverech, tak zjistíš, že je to děsně otravné. Chce to mít možnost deployovat aplikaci na pár příkazů, aby člověk nemusel neustále říkat: „Tohle si stáhni támhle a teď ještě tohle sem přilinkuj a pak už ti zbývá jenom tohleto.“
Omyl, link se do gitu uložím, takže se o to potom dál starat nemusím.
- Honza Marek
- Člen | 1664
+10
věci jako sandbox nebo samostatný repozitář s frameworkem by byly velmi fajn
- David Grudl
- Nette Core | 8227
Možná jsou to ptákoviny, ale
- je nějaký důvod, proč repozitáře prefixovat „nette-“
- proč skeleton nazývat sandbox?
- pekelnik
- Člen | 462
- Snad jen, že
git clone github.com/nette/nette-libs.git
vytvoří „smysluplně“ pojemnovaný adresář. Člověk to může obejít prostým zadáním jména adresáře:git clone github.com/nette/libs.git nette
– imho tedy nepříliš vážný důvod… - Zde vidím spíše významový posun. Zatímco skeleton byl skutečně jen kostra – pískoviště je plně funknční aplikace včetně všech závislostí.
Prefixy: -1
Sandbox: +1
Editoval pekelnik (10. 10. 2010 0:23)
- Patrik Votoček
- Člen | 2221
- ano co když se dobudoucna portfolio Nette Foundation rozšíří?
- netuším mě se skeleton líbí víc… :-)
- David Grudl
- Nette Core | 8227
Tak jsem se to pokusil rozdělit:
- framework s testy v https://github.com/nette/nette
- příklady v https://github.com/nette/examples
- nástroje v https://github.com/nette/tools
- sandbox v https://github.com/nette/sandbox
Oddělovat framework od testů se mi nechce, ačkoliv chápu, jaké výhody to má, ale šlo o drahou záplatu na nedostatek GITu. Nevím, jestli má opodstatnění dělat něco jako původní repozitář, kde by byly nalinkovány všechny moduly, asi to nebude potřeba.
Do repozitáře Tools by asi mohl přijít i Apigen. Možná je propojím se starším repem nette-extras, nebo je přejmenuju na components.
- Mikulas Dite
- Člen | 756
Rozdělení je super. Dík. Sandbox a jakákoliv další aplikace teď má ale tohle:
/libs
|---/Nette
|---/Nette
|---/Application
|---/Caching
|---/…
|---/tests
Nejlepší by bylo
/libs
|---/Nette
|---/Application
|---/Caching
|---/…
Proč oddělit testy a framework?
- při použití frameworku testuju jenom aplikaci, ne nette
- nechce se mi testy nahrávat produkční server, ale ani se starat o to je smazat/vynechat
- testování se nestane složitější, stačí přidat jeden modul; oproti tomu zbavit se testů, které jsou v modulu s frameworkem, tak snadno nejde
- David Grudl
- Nette Core | 8227
Tohle jsou argumenty platící pouze pro situace, kdy se využívá git submodule. Evidentně git submodule není dostačující řešení a nepoužívejte je. Nebo lobbujte za možnost linkovat subadresáře.
Repozitář jsem rozdělil na menší části, protože to dává smysl, nikoliv proto, aby by bylo možné používat git submodule pro nalinkování frameworku.
- VeN
- Člen | 46
Možnost linkovat podadresáře IMHO nikdo od vývojářů nevymůže. Linus o tom myslím už několikrát mluvil, že to je tak jak to je a jinak to nebude :)
Osobně raději vidím, když budou Nette knihovny dodávané s testy. Sice je uživatelé frameworku nepotřebují, ale fylozoficky IMHO patří do jednoho repositáře.
Submoduly se použít dají, Robot loader si snadno poradí s dvojitým adresářem Nette. Pouze je třeba přidat pár adresářů do netterobots.txt. V naší firmě jsme zatím na lepší způsob nepřišli. Pokud to někdo děláte lépe, velice rád si na toto téma popovídám.
Jinak díky Davide za to rozdělení :)
- David Grudl
- Nette Core | 8227
S odstupem deseti dní: vidíte rozdělení repozitáře jako správný krok nebo omyl? Viz https://forum.nette.org/…ensi-kusy-ii