Chciałem opisać koncept pracy nad dużym projektem. Wyobraźmy sobie duży projekt, wiele osób, wiele zakresów biznesowych, wiele osobnych backendów, wszystko powinno być zintegrowane do jednej spójnej aplikacji. Przy takim projekcie proponowałbym pracę w z użyciem projektu BOM (Bill of Materials).
Ten koncept wywodzi się z skomplikowanych projektów ze świata Java.
Poniżej graf przedstawiający taką strukturę.
╭─────────────╮
│ Application │
╰─────────────╯
│
╭──────────┼────────────╮
│ │ │
│ │ ╭─────────│──────────────╮
│ │ │ │ │
╭───▼───╮ ╭──▼────╮ ╭───▼───╮ ╭────▼─────────╮
│ Mod 1 │ │ Mod 2 │ │ Mod 3 │─────▶ Internal lib │
╰───────╯ ╰───────╯ ╰───────╯ ╰──────────────╯
│ │ │ │
╰──────────┼───────────╯───────────╯
│
╭────▼────╮
╭──────│ BOM │────────╮
│ ╰─────────╯ │ Internal NPM
....│...........│.............│......................
│ │ │ Public NPM
╭───▼─────╮ ╭──▼──────╮ ╭───▼──────╮
│ Angular │ │ ExLib 1 │ │ ExLib 2 │
╰─────────╯ ╰─────────╯ ╰──────────╯
Opiszę to trochę. Każdy z boxów oznacza osobny pakiet NPM, posiadający odrębną historię w Git i jest wydawany do repozytorium NPM zgodnie z zasadami semver.org.
Opisując od samej góry:
- Aplikacja - integruje moduły biznesowe, sama w sobie nie ma za dużo kodu, gdyż moduły są samowystarczalne. Integruje moduły za pomocą deklarowania zależności poprzez package.json. Zawiera główny router aplikacji. Posiada testy które weryfikują, iż moduły które używa mają kompatybilną (lub identyczną) wersję BOM
- Moduły aplikacyjne - samodzielne moduły, które można rozwijać niezależnie. Można je uruchomić w przeglądarce, testować unit oraz end 2 end. Moduły nie deklarują zależności do żadnych bibliotek publicznych, jedynie prywatnych oraz do BOM.
- Wewnętrzne biblioteki - biblioteki re-używalne, zawierają komponenty wspólne potrzebne w więcej niż jednym module. Mogą być używane w we wszystkich modułach lub tylko w niektórych. Zawierają jedynie deklarację (jedną) zależności do BOM.
- Bill of Materials (BOM) - zawiera wszystkie niezbędne deklaracje zależności bibliotek publicznych używanych we wszystkich modułach danej aplikacji. Nie zawiera żadnego kodu (lub ewentualnie testy weryfikujące poprawność rozwiązanych zależności) Celem projektu BOM jest zebranie biblioteki w formie sprawdzonych, działających ze sobą zależności. Nad aktualizacją BOM pełnią pieczę architekci i seniorzy, podobnie jak w przypadku bibliotek wewnętrznych.
- Angular, ExLib - Ogólnie dostępne pakiety NPM z npmjs.org