Rozdělení Git repositáře na menší kusy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
VeN
Člen | 46
+
0
-

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
+
0
-

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..

VeN
Člen | 46
+
0
-

To se dá u git submodulů řešit celkem efektivně. Každý submodul si můžeš checkoutnout na jakoukoliv verzi. Ve výsledku to tedy nebude tak, že aplikace poběží na Nette ve verzi z master větve, ale poběží na checkoutnutém tagu, který označuje příslušný release.

jasir
Člen | 746
+
0
-

Dá se to řešit pomocí netterobots.txt v adresári libs. Možná by se mohl netterobots.txt přidat i do distribuce (hlavní adresář)

VeN
Člen | 46
+
0
-

Dá se to řešit pomocí netterobots.txt v adresári libs.

Ano, to dá, jenže to je jenom obcházení problému. Co až tam přibude něco dalšího?

Možná by se mohl netterobots.txt přidat i do distribuce (hlavní adresář)

To už by bylo trochu lepší řešení.

Editoval VeN (22. 9. 2010 16:02)

srigi
Nette Blogger | 558
+
0
-

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)

pekelnik
Člen | 462
+
0
-

Oddělení libs/Nette do samotného repozitáře bych také uvítal :)

David Grudl
Nette Core | 8227
+
0
-

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
+
0
-

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.

Patrik Votoček
Člen | 2221
+
0
-

Jsem také ZA…

pekelnik
Člen | 462
+
0
-

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)

Filip Procházka
Moderator | 4668
+
0
-

to je naprosto geniální a dávám to největší plus :)

Aurielle
Člen | 1281
+
0
-

+1

srigi
Nette Blogger | 558
+
0
-

+1, hlavne za viac prav na menej dolezite repozz.

arron
Člen | 464
+
0
-

+1

sodae
Nette Evangelist | 250
+
0
-

pekelnik: +1

BigCharlie
Člen | 283
+
0
-

+1

westrem
Člen | 398
+
0
-

+1 vyzera to fakt fajn, najme ked clovek chce stiahnut iba libs tak nemusi stahovat aj tie veci okolo :)

pekelnik
Člen | 462
+
0
-

Jak si tak uklízím v projektu napadá mě skvělé využití submodulu nette-libs v repozitáři dibi… B-)

repli2dev
Člen | 57
+
0
-

Já to řeším stahnutím submodulů do libs_all a jejich přilinkování do libs.

VeN
Člen | 46
+
0
-

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
+
0
-

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.

pekelnik
Člen | 462
+
0
-

@vrtak: a deployment?

stáhnout, rozbalit, kopírovat? kam dáš tu starší verzi pro případ že nová schodí aplikaci?

Vyki
Člen | 388
+
0
-

Taky se mi to zdá jako dobrý nápad. Skoro se divím, že už to nezaznělo někdy dříve :D

Patrik Votoček
Člen | 2221
+
0
-

@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
+
0
-

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.

VeN
Člen | 46
+
0
-

Omyl, link se do gitu uložím, takže se o to potom dál starat nemusím.

Aha, nepředpokládal jsem, že dáváš symlinky do repositáře. Moje chyba :)

Honza Marek
Člen | 1664
+
0
-

+10

věci jako sandbox nebo samostatný repozitář s frameworkem by byly velmi fajn

David Grudl
Nette Core | 8227
+
0
-

Možná jsou to ptákoviny, ale

  1. je nějaký důvod, proč repozitáře prefixovat „nette-“
  2. proč skeleton nazývat sandbox?
pekelnik
Člen | 462
+
0
-
  1. 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…
  2. 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
+
0
-
  1. ano co když se dobudoucna portfolio Nette Foundation rozšíří?
  2. netuším mě se skeleton líbí víc… :-)
David Grudl
Nette Core | 8227
+
0
-

Tak jsem se to pokusil rozdělit:

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
+
0
-

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
+
0
-

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
+
0
-

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í :)

Nilp
Člen | 65
+
0
-

Já měl jako submodul celé nette v /dev/vendor/nette a symlinkoval adresář s třídami do /libs/nette.

Aurielle
Člen | 1281
+
0
-

Kam se ztratila minifikovaná verze? Ta bude teď jen na webu?
(nebo tam nikdy nebyla a já si to jen napamatuji? :D)

David Grudl
Nette Core | 8227
+
0
-

S odstupem deseti dní: vidíte rozdělení repozitáře jako správný krok nebo omyl? Viz https://forum.nette.org/…ensi-kusy-ii