ππ»ββοΈ ΠΠ°ΡΠ΅ΠΌ Gato GraphQL Π½ΡΠΆΠ΅Π½ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄ Ρ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» ΡΡΠ°ΡΡΡ Hosting all your PHP packages together in a monorepo, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ±ΡΡΡΠ½ΠΈΠ», Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ PHP-ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·ΠΎΠΉ, ΠΈ ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Monorepo Builder.
ΠΠ΄Π΅ΡΡ Ρ Ρ
ΠΎΡΠ΅Π» Π±Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡ ΡΡΠ°ΡΡΡ, Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠ±ΡΡΡΠ½ΠΈΠ², ΠΏΠΎΡΠ΅ΠΌΡ ΠΊΠΎΠ΄ΠΎΠ²Π°Ρ Π±Π°Π·Π° GatoGraphQL/GatoGraphQL (Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Ρ Gato GraphQL, Π»Π΅ΠΆΠ°ΡΠΈΠΉ Π² Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π²ΠΈΠΆΠΎΠΊ GraphQL ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ½Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½Π°) Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Ρ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ».
ΠΠ°ΡΠ΅ΠΌ Gato GraphQL Π½ΡΠΆΠ΅Π½ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ CMS ΠΊΠΎΠ΄ΠΎΠ²Π°Ρ Π±Π°Π·Π° Gato GraphQL ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π±ΡΠ»Π° ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΡΠ΅ΡΠ΅Π· Composer. Π ΠΎΠ±ΡΠ΅ΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π±ΡΠ»ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ 100 ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²! (ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈΡ ΡΠΈΡΠ»ΠΎ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ 200.)
ΠΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΈΡ
ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΡΠ΅ΡΠ΅Π· Composer: Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ composer install, ΠΈ Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΆΠΈΠ²ΡΡ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ β ΠΈΠ·-Π·Π° Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½, ΠΈ ΠΊΠ°ΠΆΠ΄Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π²Π΅ΡΡΠΈΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π²Π·Π°ΠΈΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π²ΡΠ΅Ρ Π²Π΅ΡΡΠΈΠΉ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ PR ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ»Π°ΡΡ Π±Ρ Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΊΠΎΡΠΌΠ°Ρ, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡΠΈΠΉ ΡΠ°ΡΠ΅Π»ΠΊΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ-ΡΠΏΠ°Π³Π΅ΡΡΠΈ: Π²ΠΈΠ΄ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠΊ ΠΎΠ΄Π½ΠΎΠΉ Π»Π°ΠΏΡΠΈ, Π½ΠΎ Π½Π΅ Π·Π½Π°Π΅ΡΡ, Π³Π΄Π΅ ΠΎΠ½Π° Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ.

ΠΠΎ ΠΏΡΠ°Π²Π΄Π΅ Π³ΠΎΠ²ΠΎΡΡ, ΡΠ²ΡΠ·ΡΠ²Π°ΡΡ Π²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π²Π΅ΡΠΎΠΊ Π²ΠΎ Π²ΡΠ΅Ρ
Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Π½ΡΡ
ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΡ
ΡΡΠ°Π»ΠΎ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ, ΡΡΠΎ Ρ ΠΈ Π²ΠΎΠ²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π» ΡΡΠΈΠΌ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ: ΠΏΡΠΎΡΡΠΎ ΠΏΡΡΠΈΠ» ΠΊΠΎΠ΄ Π½Π°ΠΏΡΡΠΌΡΡ Π² Π²Π΅ΡΠΊΡ master ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈ Π·Π°ΡΠ΅ΠΌ Π²Π΅Π·Π΄Π΅ Π·Π°Π²ΠΈΡΠ΅Π» ΠΎΡ Π²Π΅ΡΡΠΈΠΈ dev-master.
ΠΡΠΎ Π±ΡΠ»ΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π² GatoGraphQL/GatoGraphQL ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΈΡΡΠ½ΡΠΉ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ: ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠ³Π° Π²Ρ ΠΎΠ΄Π° Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠΎΡΠΎΠ²
ΠΠ°ΠΊ Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ» Π² ΡΡΠ°ΡΡΠ΅, Π² ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΠΏΠΎΠΊΠΈΠ½ΡΠ» ΠΏΡΠΎΠ΅ΠΊΡ Π΅ΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΏΠ΅Π» ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ, β ΠΈΠ·-Π·Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ°Π±ΠΎΡΠ΅Π΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅.
ΠΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π±ΡΠ»Π° ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ Π±ΡΠ» Π°Π²ΡΠΎΡΠΎΠΌ, ΠΌΠ½Π΅ ΡΠ΄Π°Π²Π°Π»ΠΎΡΡ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡ ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ VSCode, ΡΡΠΎ ΠΊΠΎΠ΅-ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ.
Π― ΠΏΡΡΠ°Π»ΡΡ ΡΠΏΡΠΎΡΡΠΈΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΡΠΎΠΉ ΠΆΠ΅ ΡΡΠ΅Π΄Ρ Π΄Π»Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠΎΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ bash-ΡΠΊΡΠΈΠΏΡΠ°. ΠΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅ΡΡΠ½ΠΎ, ΡΡΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠ³Π»ΠΎ ΡΡΠ°Π±ΠΎΡΠ°ΡΡ β ΡΡΠΎ Π±ΡΠ»Π° ΠΏΡΠΎΠΈΠ³ΡΠ°Π½Π½Π°Ρ Π±ΠΈΡΠ²Π° Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π°, ΠΈ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΌΠΎΠ³ Π½Π°ΡΠ°ΡΡ Π²Π½ΠΎΡΠΈΡΡ Π²ΠΊΠ»Π°Π΄ Π² ΠΏΡΠΎΠ΅ΠΊΡ.
Π‘ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ Ρ ΠΌΠΎΠ³Ρ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΡΠΏΠ°ΡΡ ΠΏΠΎ Π½ΠΎΡΠ°ΠΌ, Π·Π½Π°Ρ, ΡΡΠΎ Π½Π΅ Π±ΡΠ΄Ρ ΠΎΡΠΏΡΠ³ΠΈΠ²Π°ΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠΎΡΠΎΠ² ΡΡΠ΅Π·ΠΌΠ΅ΡΠ½ΠΎΠΉ Π±ΡΡΠΎΠΊΡΠ°ΡΠΈΠ΅ΠΉ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π°Ρ ΠΎΡΡΡ ΠΏΡΠΈΠ½ΡΡΡ ΡΡΠ°ΡΡΠΈΠ΅.
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
ΠΠ°ΠΊ Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ» Π² ΡΡΠ°ΡΡΠ΅, ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Monorepo Builder ΠΏΠ΅ΡΠ΅Π΄ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°ΠΌΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° Π½Π° PHP ΠΈ Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΡΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ push Π² master ΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΌΠ°ΡΡΠΈΡΠ° Π² GitHub Action ΠΎΠ±ΡΡΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ runner Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ΄ Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ (Π΄Π»Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· Packagist).
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ GatoGraphQL/GatoGraphQL ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π±ΠΎΠ»Π΅Π΅ 200 ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ, ΡΡΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΎΡΡ Π±ΠΎΠ»Π΅Π΅ 200 ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² runner.

ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ GitHub ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ Π·Π°Π΄Π°Ρ Π΄ΠΎ 20. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΌΠ½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΠΆΠ΄Π°ΡΡ ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, GitHub ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ runner Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΆΠ΄Π°ΡΡ:

ΠΡΡ ΡΡΠΎ Π²ΡΠ»ΠΈΠ²Π°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. ΠΡΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ 200 ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ PR ΠΌΠΎΠ³Π»ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π΄ΠΎ 1 ΡΠ°ΡΠ°! ΠΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠ΅ΡΠΈΡΡ.
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Monorepo builder
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ:
vendor/bin/monorepo-builder packages-json
ΠΠΎ Π·Π°ΡΠ΅ΠΌ Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π»: Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ β ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΊΠΎΠ΄, ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΠΉ Π² PR.
ΠΡΠ»ΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ·Π½Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠΎ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π² ΠΊΠ°ΠΊΠΈΡ
ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ
ΠΎΠ½ΠΈ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ: Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ git diff ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ packages-json ΡΠ΅ΡΠ΅Π· Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ filter, Π²ΠΎΡ ΡΠ°ΠΊ:
vendor/bin/monorepo-builder packages-json --filter=modified_file_1 --filter=modified_file_2 --filter=...ΠΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π° packages-json, ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠ°Ρ Ρ Monorepo Builder, Π½Π΅ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ filter. ΠΠΎΡ Π·Π΄Π΅ΡΡ ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ.
Monorepo builder ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Symfony's DependencyInjection, ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ, Π²Π½Π΅Π΄ΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ Π² Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ monorepo-builder.php ΡΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΎΡΠΎΠΌ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ².
ΠΠΎΡΡΠΎΠΌΡ Ρ ΡΠ°ΡΡΠΈΡΠΈΠ» Monorepo builder Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ package-entries-json, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ filter:
final class PackageEntriesJsonCommand extends AbstractSymplifyCommand
{
private PackageEntriesJsonProvider $packageEntriesJsonProvider;
public function __construct(PackageEntriesJsonProvider $packageEntriesJsonProvider)
{
$this->packageEntriesJsonProvider = $packageEntriesJsonProvider;
parent::__construct();
}
protected function configure(): void
{
$this->setDescription('Provides package entries in json format. Useful for GitHub Actions Workflow');
$this->addOption(
Option::FILTER,
null,
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
'Filter the packages to those from the list of files. Useful to split monorepo on modified packages only',
[]
);
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
/** @var string[] $fileFilter */
$fileFilter = $input->getOption(Option::FILTER);
$packageEntries = $this->packageEntriesJsonProvider->providePackageEntries($fileFilter);
// must be without spaces, otherwise it breaks GitHub Actions json
$json = Json::encode($packageEntries);
$this->symfonyStyle->writeln($json);
return ShellCode::SUCCESS;
}
}ΠΠ½Π° Π²Π½Π΅Π΄ΡΡΠ΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->defaults()->autowire()->autoconfigure();
$services->set(PackageEntriesJsonCommand::class);
}Π’Π΅ΠΏΠ΅ΡΡ Π½ΠΎΠ²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° package-entries-json Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½Π° Π΄Π»Ρ workflow GitHub Action.
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π² GitHub Action
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ workflow.
Π― ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ action technote-space/get-diff-action, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ git diff Π²ΡΠ΅Ρ
ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ² Π² PR:
# git diff to generate matrix with modified packages only
- uses: technote-space/get-diff-action@v4
with:
PATTERNS: layers/*/*/*/**ΠΠ° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΈΡ
ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² (Ρ
ΡΠ°Π½ΡΡΠΈΡ
ΡΡ Π² ${{ env.GIT_DIFF }}) Ρ Π·Π°ΡΠ΅ΠΌ ΡΠΎΡΠΌΠΈΡΡΡ Π²ΡΠ·ΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ package-entries-json ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ Π΅Ρ ΠΊΠ°ΠΊ output:
- id: output_data
name: Calculate matrix for packages
run: |
quote=\'
clean_diff="$(echo "${{ env.GIT_DIFF }}" | sed -e s/$quote//g)"
packages_in_diff="$(echo $clean_diff | grep -E -o 'layers/[A-Za-z0-9_\-]*/[A-Za-z0-9_\-]*/[A-Za-z0-9_\-]*/' | sort -u)"
echo "[Packages in diff] $(echo $packages_in_diff | tr '\n' ' ')"
filter_arg="--filter=$(echo $packages_in_diff | sed -e 's/ / --filter=/g')"
echo "::set-output name=matrix::$(vendor/bin/monorepo-builder package-entries-json $(echo $filter_arg))"ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ:
outputs:
matrix: ${{ steps.output_data.outputs.matrix }}Π Π°Π±ΠΎΡΠ°Π΅Ρ ΠΎΡΠ»ΠΈΡΠ½ΠΎ! Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° ΠΏΠ°ΠΊΠ΅ΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΠΌΠ°ΡΡΠΈΡΠ΅ Π±ΡΠ»ΠΎ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ 2 ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°:

Π’Π΅ΠΏΠ΅ΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ PR Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅Π³ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΈΠ½ΡΡ (Π²ΠΌΠ΅ΡΡΠΎ 1 ΡΠ°ΡΠ°), ΡΠ°ΠΊ ΡΡΠΎ Ρ ΡΠ½ΠΎΠ²Π° ΡΡΠ°ΡΡΠ»ΠΈΠ²ΡΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ.
ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ / ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ
ΠΡΡΡ Π΅ΡΡ ΠΎΠ΄Π½Π° ΠΎΠ±Π»Π°ΡΡΡ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° GitHub Action: ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠ΅ΡΡΠΎΠ² PHPUnit.
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π²Π΅ΡΡ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². ΠΠΎ ΡΡΠΎ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
ΠΠΎΠΏΡΡΡΠΈΠΌ, ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 3 ΠΏΠ°ΠΊΠ΅ΡΠ°: A, B ΠΈ C, Π³Π΄Π΅ B Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ A, Π° C Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ B.
Π’ΠΎΠ³Π΄Π°, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΊΠΎΠ΄ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°, Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ, Π±ΡΠ΄Π΅Ρ ΡΠ°Π·Π½ΡΠΌ:
- ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° A: Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ A, B ΠΈ C
- ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° B: Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ B ΠΈ C
- ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° C: Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ C
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² (ΠΊΠ°ΠΊ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ) ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ Π½ΠΈΡ ΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡ Π½ΠΈΡ Π·Π°Π²ΠΈΡΡΡ.
ΠΠ΄Π½Π°ΠΊΠΎ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π² ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ .
Π₯ΠΎΡΡ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ composer.json ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ΅ΡΠ΅Π· Composer, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² composer info ${ package_name }, Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² ΡΠ΅ΠΊΡΠΈΠΈ replace, Π° Π½Π΅ Π² require.
ΠΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π°Ρ
ΠΎΠ΄ΠΈΡΡ Π² ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°, Π²ΡΠΏΠΎΠ»Π½ΡΡΡ composer install, Π° Π·Π°ΡΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ composer info. ΠΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ composer install Π±ΠΎΠ»Π΅Π΅ 200 ΡΠ°Π· β ΡΡΠΎ Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π±Π΅Π·ΡΠΌΠΈΠ΅.
ΠΠΎΡΡΠΎΠΌΡ Ρ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π» ΡΡΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ. ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΡΠΎΠ·Π΄Π°Π» issue ΠΈ Π½Π°Π΄Π΅ΡΡΡ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ Π½Π°ΠΉΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠΎΠ΄Π²ΠΎΠ΄Ρ ΠΈΡΠΎΠ³ΠΈ
ΠΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Ρ ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ ΠΎΡΠΊΡΡΡΠΈΠ΅ΠΌ Monorepo Builder. ΠΠ΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠΌΠΎΠ³ Π±Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·ΠΎΠΉ Gato GraphQL ΠΈΠ½Π°ΡΠ΅.
Π― Π½Π΅ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Ρ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. ΠΠΎ ΠΊΠΎΠ³Π΄Π° Ρ Π²Π°Ρ Π±ΠΎΠ»Π΅Π΅ 200 ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΊΠ°ΠΊ Π² ΠΌΠΎΡΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ 20, ΠΎΠ½ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΆΠΈΠ·Π½Ρ.
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΡΡΠΈΠ»ΠΈΠΉ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ, Π½ΠΎ ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΈ ΡΡΠΈΠ»ΠΈΡ Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠ»Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.