# 2. Organizacja repozytorium
Aby w łatwy sposób móc pracować z różnymi paczkami w kontekście jedngo repozytorium przyjeliśmy strategorie typu monorepo (opens new window) wykorzystując przy tym mechanizm yarn workspaces (opens new window) - tzn, że osobne paczki aplikacji frontendowej oraz częsci UI mogą być zawarte w jednym repozytorium. Dzięki temu rozwiązujemy kilka problemów i głównych założeń:
Aplikacja frontendowa musi wiedzieć o komponentach UI - musi mieć do nich dostęp, najlepiej w formie paczki npm - w klasycznym podejściu kiedy to paczka UI jest osobnym repozytorium praca jest utrudniona, ponieważ należy sklonować osobno projekt UI a następnie go podlinkować w aplikacji frontendowej np. używając
yarn link- tak aby nasz moduł UI w aplikacji frontendowej symlinkował na repozytorium ściągnięte lokalnie.Upgrade paczki
UI- w przypadku osobnego repozytorium, przy każdej nowej wersji musielibyśmy najpierw commitować zmiany do repozytoriumUIa dopiero później w repozytoriumFRONTmusielibyśmy wykonać operacjęyarn upgradepodnoszącą wersję repozytoriumUI.Problem pojawia się nie tylko przy wydawaniu zmian, ale przy zarządzaniu tymi zmianami per różne środowiska np.
FRONTdla wersji develop musi mieć osobną gałąźdevelopdla paczkiUI.Problem z utrzymywaniem różnych wersji modułów npm pomiędzy repozytoriami
FRONTorazUI. Np. w paczceUIwykorzystujemy Vue.js w wersji 2.6 i wartoby było w paczkeFRONTutrzymywać tą samą wersję.
W przypadku wykorzystania yarn workspaces sytuacja jest uproszczona, oponieważ paczka UI znajduje się w tym samym repozytorium co aplikacja front, ponadto możemy ją importować jako moduł npm, a wszysztkie paczki pomiędzy workspaceami są współdzielone - więcej o tym poniżej.
# 2.1 Przykład konfiguracji
Tworzymy folder pod nasz projekt:
mkdir project && cd project
Inicjalizujemy projekt przez stworzenie pliku package.json
yarn init
Wynik operacji
➜ project yarn init
yarn init v1.22.4
question name (project):
question version (1.0.0):
question description:
question entry point (index.js):
question repository url:
question author:
question license (MIT):
question private: yes
success Saved package.json
✨ Done in 19.71s.
2
3
4
5
6
7
8
9
10
11
12
Teraz stworzymy dwa foldery, które bedą odpowiedzialne za paczki FRONT oraz UI
mkdir project-front && mkdir project-ui
Następnie w tych dwóch folderach inicjalizujemy projekty przez stworzenie plików package.json w ten sam sposób jak dla folderu project
Wykonaj komendę w głównym folderze, aby zainstalować (symlinkować) nasze paczki jako node_modules
yarn
Wynik powyższych operacji:
├── node_modules
│ ├── project-front -> ../project-front
│ └── project-ui -> ../project-ui
├── package.json
├── project-front
│ └── package.json
├── project-ui
│ └── package.json
└── yarn.lock
5 directories, 4 files
2
3
4
5
6
7
8
9
10
11
# 2.2 Symulacja użycia
Możemy zasymulować i użyć plików z paczki UI w paczce FRONT.
- Stwórz plik
index.jswproject-ui:
touch ./project-ui/index.js
index.js:
const myComponent = () => {
console.log('Hello from UI')
}
module.exports = { myComponent }
2
3
4
5
- Stwórz plik
index.jswproject-front:
touch ./project-front/index.js
index.js:
const { myComponent} = require('project-ui')
myComponent()
2
Wykonaj skrypt:
node ./project-front/index.js
Hello from UI
2
Aby powyższy kod zadziałał, tzn aby móc importować z paczek, musimy ustawić tak zwane pole main czyli entry point dla naszego modułu. Domyślnie jest to plik index.js
project-ui/package.json:
{
"name": "project-ui",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"private": true
}
2
3
4
5
6
7
# 2.3 Praca z monorepo
Należy mieć na uwadzę, że kiedy chcemy zainstalować nową paczkę w sposób do którego przywykliśmy czyli yarn add nazwa-paczki zmienia się - jeżeli robimy to z poziomu głównego folderu - musim pamiętać o worskapce do którego chcemy dodać nową paczkę.
yarn workspace project-ui add vue-svgicon
yarn workspace project-ui remove vue-svgicon
Należy również zwrócić uwagę na miejsce instalacji paczek - jeżeli wszystkie paczki wykorzystują wspólną wersję modułu to ten moduł znajdzie się w node_modules w głównym folderze repozytorium - w przeciwnym wypadku jeżeli paczka X wykorzystuje moduł webpack@5 a paczka Z webpack@4 to każda z tych paczek będzie miała swój folder node_modules.
# 2.4 Linki
https://classic.yarnpkg.com/en/docs/workspaces (opens new window) Przejście na monorepo bez utraty historii git (opens new window)