Intangiriro Kuki Monorepo? Muri iki gihe, ubwihindurize bwihuse bwiterambere rya software ntibishobora guhakana. Amakipe arakura, imishinga ikunda kuba ingorabahizi. Isosiyete ikoresha umutungo wingenzi kugirango ikomeze codebase yagabanijwe igizwe nibice byinshi. Injira monorepo - ububiko bumwe, buhurijwe hamwe buhuza code yawe yose. Aho kuba icyerekezo, monorepos iherutse kuba uburyo bwububiko bwo kubika codebase yose ahantu hamwe. Amakipe abona uburyo bunoze bwo kugabana, gukorana neza nigikoresho gisanzwe gishimangira gukoresha kode. Gushiraho Imyenda Yumwanya Icyitonderwa: Muri iyi ngingo, igihe cyose havuzwe "Yarn", yerekeza cyane cyane kuri Yarn v4 - verisiyo iheruka itanga ubushobozi bwongerewe imikorere. Umwanya w'akazi ni iki? Umwanya wakazi ni paki ya monorepo, bakunze kwita paki. Bagufasha gucunga paki nyinshi mububiko bumwe bitagoranye. Hamwe nakazi. urashobora: Kugabana Biterwa Byoroshye: Sangira ibintu rusange biterwa numushinga wawe ntakabuza. Koroshya imiyoborere ishingiye: Yarn ihita ihuza paki zaho, kugabanya kwigana no koroshya iterambere. Kwihutisha Kwishyiriraho: Wungukire kubikorwa bya Yarn optimizasiyo hamwe nuburyo bwo gufunga (urugero, ). byubatswe muri plug'n'play Kunoza igenzura kuri Monorepo: Sobanura (amategeko) kandi ukoreshe kugirango ukomeze guhuzagurika. inzitizi amacomeka menshi aboneka Mugihe Yarn numuyobozi watoranijwe kuriyi ngingo abikesheje ubworoherane, umuvuduko, hamwe nuburyo bwagutse bwo guhitamo - ni ngombwa kumenya ko guhitamo kwiza biterwa numushinga wawe ukeneye, ibyo ukunda, hamwe nakazi muri rusange. Kurugero, na nibindi bikoresho bigezweho bitanga ibintu byinshi biranga. PNPM Turborepo Iboneza ryambere Gushiraho imyenda ni inzira itaziguye. Kurikiza ubuyobozi bwemewe bwo gushiraho no kugena Yarn mumushinga wawe: . Yarn Installation Guide Umaze kurangiza kwishyiriraho, reka tujye mumiterere. Kubera ko dukoresha plug'n'play, ugomba kwemeza ko IDE yawe imenya neza ibyo biterwa. Niba ukoresha VSCode, koresha: # Typescript is required for VSCode SDK to set up correctly yarn add -D typescript@^5 yarn dlx @yarnpkg/sdks vscode Niba ukoresha undi mwanditsi wa code, reba SDK iboneka hano: . Yarn Muhinduzi SDKs Kuri iyi ngingo, mwese mwiteguye gutangira gukoresha Yarn. Gutegura Imiterere ya Monorepo Noneho ko pake umuyobozi yashizweho, igihe kirageze cyo gutegura umushinga munini wimishinga. Imiterere isobanutse, isobanuwe neza ntabwo yorohereza ububiko bworoshye kuyobora gusa ahubwo inateza imbere kode nziza. Mururugero, tuzagabanya codebase mubyiciro bitatu byingenzi: : Porogaramu Umukiriya: Harimo ibicuruzwa byanyuma, byoherezwa ibicuruzwa byabakiriya. Seriveri: Irimo ibicuruzwa byanyuma, byoherejwe. : Ibiranga Umukiriya: Kuri widgets ya UI yihariye. Seriveri: Kuri standalone backend business logic ibice. : Libs Amazu asangiye kode nkibishushanyo mbonera bya sisitemu, imiterere, umutungo, nibikorwa. Aka ni imiterere idafite imiterere yo kubika logique ikoreshwa. Kugaragaza imbaraga zubu bubiko bwububiko, reka dutangire twongeraho ububiko bukomeye kurutonde rwakazi rwa Yarn. Muri pake yawe.json, ongeramo ibi bikurikira: "workspaces": [ "apps/**", "features/**", "libs/**" ] Iboneza bibwira Yarn gufata paki muri ubu bubiko nkibikoresho byaho. Ibizakurikiraho bizemeza ko biterwa na buri paki byashyizweho neza kandi bihujwe. Kode ya Kode Muri iki gice, tuzanyura kuri codebase ntoya yerekana uburyo bwo gukuramo monorepo. Aho kugirango ushiremo kode yuzuye, nzatanga ingero ngufi zifitanye isano na dosiye zuzuye . mububiko bwakozwe kubwiyi ngingo Bootstrapping Seriveri Porogaramu Dutangirana na yoroshye yo kwemeza abakoresha. Porogaramu ya seriveri yerekana impera imwe ( ) ikoresha umukoresha kuva mubindi bikoresho. Express API /auth/signIn import express from "express"; import cors from "cors"; import { signInHandler } from "@robust-monorepo-yarn-nx-changesets/sign-in-handler"; const app = express(); const port = process.env.PORT || 1234; app.use(express.json()); app.use( cors({ origin: process.env.CORS_ORIGIN || "http://localhost:3000", }) ); app.post("/auth/signIn", signInHandler); app.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); }); Ihuza kuri paki Nkuko mubibona, mpera ikoresha umukoresha watumijwe mubindi bikoresho. Ibyo bituzanira ibice bikurikira: ibiranga seriveri. /auth/signIn Bootstrapping ya seriveri Ikiranga Seriveri ya seriveri ikubiyemo kwemeza logique. Muri iyi paki, turasobanura umukoresha-winjira, ukoresha ibyasangiwe byemewe kuva muri libs. import type { RequestHandler } from "express"; import { passwordValidator, usernameValidator, } from "@robust-monorepo-yarn-nx-changesets/validator"; const signInHandler: RequestHandler = (req, res) => { if (!req.body) { res.status(422).send("Request body is missing"); return; } if (typeof req.body !== "object") { res.status(422).send("Request body expected to be an object"); return; } const { username, password } = req.body; const usernameValidationResult = usernameValidator(username); if (typeof usernameValidationResult === "string") { res .status(422) .send("Invalid username format: " + usernameValidationResult); return; } const passwordValidationResult = passwordValidator(password); if (typeof passwordValidationResult === "string") { res .status(422) .send("Invalid password format: " + passwordValidationResult); return; } // Emulate a successful sign-in if (username === "test" && password === "test1234") { res.status(200).send("Sign in successful"); return; } return res.status(422).send("Username or password is incorrect"); }; export default signInHandler; Ihuza kuri paki Ubu buryo bukubiyemo incamake yo kwemeza muri pake yayo, ikemerera gutera imbere no gukomeza kwigenga. Reba uburyo ibikorwa byemeza ibikorwa bitumizwa muri . lib bisangiwe Gutangiza abakiriya Ibikurikira, reka turebe kuruhande rwabakiriya. Mubikorwa byabakiriya bacu, twubaka urubuga rworoshye rushoboza kwemeza ukoresha mugutabaza seriveri API. "use client"; import { SignInForm } from "@robust-monorepo-yarn-nx-changesets/sign-in-form"; const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:1234"; export default function Home() { const handleSubmit = async (username: string, password: string) => { const response = await fetch(`${API_URL}/auth/signIn`, { method: "POST", body: JSON.stringify({ username, password }), headers: { "Content-Type": "application/json", }, }); if (response.status === 200) { alert("Sign in successful"); return; } if (response.status === 422) { alert("Sign in failed: " + (await response.text())); return; } alert("Sign in failed"); }; return ( <div className="w-full h-screen overflow-hidden flex items-center justify-center"> <SignInForm onSubmit={handleSubmit} /> </div> ); } Ihuza kuri paki Muriyi ngero, ibice bya bitumizwa mubikoresho byabakiriya biranga, bituganisha kumurongo wanyuma. SignInForm Bootstrapping Umukiriya Ikiranga Umukiriya ibiranga paki itanga ifishi yo kwemeza hamwe na logique isangiwe yo kwemeza. Ibi birinda kwigana code kandi byemeza ko bihoraho. import { passwordValidator, usernameValidator, } from "@robust-monorepo-yarn-nx-changesets/validator"; interface SignInFormProps { onSubmit: (username: string, password: string) => void; } const SignInForm = ({ onSubmit }: SignInFormProps) => { const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault(); const username = (event.currentTarget[0] as HTMLInputElement).value; const usernameValidationResult = usernameValidator(username); if (typeof usernameValidationResult === "string") { alert(usernameValidationResult); return; } const password = (event.currentTarget[1] as HTMLInputElement).value; const passwordValidationResult = passwordValidator(password); if (typeof passwordValidationResult === "string") { alert(passwordValidationResult); return; } onSubmit(username!, password!); }; return ( <form onSubmit={handleSubmit}> <input type="text" placeholder="Username" /> <input type="password" placeholder="Password" /> <button type="submit">Submit</button> </form> ); }; export default SignInForm; Ihuza kuri paki Hano, twongeye kubona imikoreshereze kuva libs dusangiye, tukemeza ko logique yo kwemeza iri hagati kandi ikabikwa byoroshye. yukwemeza Nibyo kuri codebase ntoya. Wibuke ko iyi code ari ikigereranyo cyoroheje kigamije kwerekana imiterere shingiro no guhuza hagati ya Porogaramu, Ibiranga, na Libs muri monorepo. Urashobora kwaguka kuri izi ngero nkuko bikenewe kugirango uhuze umushinga wawe usabwa. Gukoresha Inyandiko hamwe na NX Gucunga inyandiko muri monorepo birashobora kugorana. Mugihe Yarn igushoboza ukoresheje ibintu bitandukanye, birashobora gusaba inyandiko yihariye kugirango igenzure byinshi. Aha niho NX ije: itanga ibisubizo-byo-bisubizo kugirango bikorwe neza, bigamije inyandiko. gukoresha inyandiko zinyandiko nyinshi Intangiriro kuri NX NX ni sisitemu yo kubaka yatunganijwe kuri monorepos ifite ubushobozi bwa CI buhanitse. Hamwe na NX, urashobora: : Koresha guhuza kugirango wihutishe kubaka. Koresha imirimo neza muburyo bubangikanye : Sobanukirwa n'amasano hagati yamapaki ninyandiko. Menya isano yo kwishingikiriza : Irinde akazi karenze muguhisha ibisubizo. Cache inyandiko yo gukora ibisubizo Kwagura imikorere ukoresheje . Hindura imyitwarire hamwe namacomeka: ecosystem ikungahaye kumacomeka Intego yo Gushyira mu bikorwa Kugirango dukoreshe ubushobozi bwa NX, dukeneye mbere na mbere gukora dosiye kugirango dusobanure amategeko agenga inyandiko zacu. Hasi ni urugero rwiboneza: nx.json { "targetDefaults": { "build": { "dependsOn": [ "^build" ], "outputs": [ "{projectRoot}/dist" ], "cache": true }, "typecheck": { "dependsOn": [ "^build", "^typecheck" ] }, "lint": { "dependsOn": [ "^build", "^lint" ] } }, "defaultBase": "main" } Mu Cyongereza cyoroshye, iyi miterere isobanura: Kubaka inyandiko ya pake biterwa nubwubatsi bwubaka bushingiye, kandi ibisohoka ni cashe. build Kwandika Imyandikire ya paki biterwa nubwubatsi hamwe nimyandikire yimyandikire yabyo. typecheck Lint Inyandiko ya paki iterwa nuburyo bwubaka hamwe na linti yinyandiko zishingiye. lint Noneho, reka twongere inyandiko kuri : package.json "scripts": { "build:all": "yarn nx run-many -t build", "build:affected": "yarn nx affected -t build --base=${BASE:-origin/main} --head=${HEAD:-HEAD}", "typecheck:all": "yarn nx run-many -t typecheck", "typecheck:affected": "yarn nx affected -t typecheck --base=${BASE:-origin/main} --head=${HEAD:-HEAD}", "lint:all": "yarn nx run-many -t lint", "lint:affected": "yarn nx affected -t lint --base=${BASE:-origin/main} --head=${HEAD:-HEAD}", "quality:all": "yarn nx run-many --targets=typecheck,lint", "quality:affected": "yarn nx affected --targets=typecheck,lint --base=${BASE:-origin/main} --head=${HEAD:-HEAD}" } Hano, turasobanura ubwoko bune bwimyandikire: Yubaka paki. kubaka: Kugenzura ubwoko bwa paki. Imyandikire: Yerekana paki. lint: Ikoresha imashini yandika na lint. ' ubuziranenge: Buri nyandiko ifite ibintu bibiri bitandukanye: Koresha inyandiko kuri paki zose. byose: Koresha inyandiko gusa kuri paki zatewe nimpinduka ziherutse. Ibihinduka na ibidukikije biguha uburenganzira bwo kwerekana urwego (usanzwe uturuka ku hamwe na iriho ubu), bigushoboza gukora granulaire kubisabwa gukurura. Ibi birashobora kubika neza umwanya numutungo. byagize ingaruka: BASE HEAD origin/main HEAD Gucunga Uruziga NX itanga kandi kubyara igishushanyo mbonera, gishobora gufasha mukumenya kwizerwa. Inyandiko ikurikira ikoresha ibishushanyo mbonera bya NX kugirango igenzure uruziga kandi birananirana niba hari bibonetse. amabwiriza-yo Kora dosiye hamwe nibikurikira: scripts/check-circulardeps.mjs import { execSync } from "child_process"; import path from "path"; import fs from "fs"; const hasCycle = (node, graph, visited, stack, path) => { if (!visited.has(node)) { visited.add(node); stack.add(node); path.push(node); const dependencies = graph.dependencies[node] || []; for (const dep of dependencies) { const depNode = dep.target; if ( !visited.has(depNode) && hasCycle(depNode, graph, visited, stack, path) ) { return true; } if (stack.has(depNode)) { path.push(depNode); return true; } } } stack.delete(node); path.pop(); return false; }; const getGraph = () => { const cwd = process.cwd(); const tempOutputFilePath = path.join(cwd, "nx-graph.json"); execSync(`nx graph --file=${tempOutputFilePath}`, { encoding: "utf-8", }); const output = fs.readFileSync(tempOutputFilePath, "utf-8"); fs.rmSync(tempOutputFilePath); return JSON.parse(output).graph; }; const checkCircularDeps = () => { const graph = getGraph(); const visited = new Set(); const stack = new Set(); for (const node of Object.keys(graph.dependencies)) { const path = []; if (hasCycle(node, graph, visited, stack, path)) { console.error("🔴 Circular dependency detected:", path.join(" → ")); process.exit(1); } } console.log("✅ No circular dependencies detected."); }; checkCircularDeps(); Iyi nyandiko: Kora itegeko rya NX kubyara igishushanyo mbonera. Soma igishushanyo kiva muri dosiye ya JSON yigihe gito. Isubiramo kenshi kuri cycle. Andika ikosa hanyuma usohoke niba hagaragaye uruziga. Kwemeza Biterwa na Yarn Inzitizi Mugihe imishinga ikura, gukomeza guhuzagurika mubiterwa biba ingorabahizi. Gushyira mu bikorwa amategeko akomeye yerekeye kwishingikiriza, verisiyo ya Node, nibindi bikoresho ni ngombwa kugirango wirinde umwenda wa tekiniki udakenewe. Inzitizi Yarn itanga uburyo bwo gutangiza ibyo byemezo. Sobanukirwa n'inzitizi Inzitizi Yarn ni urutonde rwamategeko yo gupakira muri monorepo yawe. Inyungu igaragara yo kuyikoresha nuko uri umuyobozi waya mategeko. Kurugero, urashobora gushyiraho itegeko ryo guhatira paki zose gukoresha verisiyo imwe. Iyo bimaze gushyirwaho, ntuzigera uhura nikibazo mugihe porogaramu yakiriye idashobora gukoresha ibiranga / lib hamwe na verisiyo ihanitse. Mugihe kwimura monorepo nini kuri verisiyo nshya yingenzi yo kwishingikiriza bishobora kuba bigoye, ukoresheje imbogamizi amaherezo bizana guhuzagurika no gutuza kumushinga wose. Gushimangira Murugero rwububiko bwacu, dukoresha dosiye kugirango dushimangire guhuza: yarn.config.cjs Inyandiko Yarn Imirongo Kugirango wemererwe guhinduka mugihe cyinzibacyuho, urashobora gusobanura ibitandukanijwe kugirango uhindure byigihe gito kugenzura. Urugero: const workspaceCheckExclusions = []; const dependencyCheckExclusions = []; Ihinduka ryakwemerera gukuramo umwanya wihariye cyangwa ibikorwa bivuye mubikorwa byo kwemeza, kwemeza kwimuka neza mugihe bibaye ngombwa. Gucunga verisiyo hamwe nimpinduka Ikindi kibazo ushobora guhura nacyo cyo gukura kwububiko ni verisiyo yo gucunga no gusohora. Impinduka zitanga igisubizo cyiza cyo gutangiza iki gikorwa, kwemeza ko impinduka zose zikurikiranwa, zahinduwe kandi zisohoka. Intangiriro Kuri Impinduka ni igikoresho gifungura isoko yagenewe gucunga verisiyo mububiko bwa monorepo. Yoroshya inzira yo gukurikirana impinduka mugutanga mu nyandiko nto, zisomwa n'abantu zifata intego y'impinduka. Izi nyandiko zitwa impinduka. Inyungu z'ingenzi zirimo: Impinduka Sobanura Inyandiko Buri mpinduka yerekana impinduka zakozwe, zifasha abitezimbere n'abaguzi kumva icyo ugomba gutegereza mubisohoka bishya. Igenzura rya Granular Buri paki yahinduwe yigenga, yemeza ko gusa ibipapuro byangijwe byavuguruwe. Ibi bigabanya ibyago byubusa byubusa no gutandukana. Ubufatanye-Nshuti Nkuko impinduka zose zanditswe binyuze mumahinduka, amakipe arashobora gusuzuma no kwemeza ibishya mbere yo gusohora nyirizina. Gutanga ibyasohotse Kimwe mu bintu bikomeye biranga Impinduka nubushobozi bwo gutangiza inzira. Urashobora kwinjiza Impinduka mumiyoboro yawe ya CI / CD hanyuma ukibagirwa impinduka zintoki hamwe no gutangaza NPM. Reba akazi keza murugero rwububiko. Ifite intambwe. Intambwe ishyigikiwe GitHub ikora amarozi yose. Ukeneye gusa gushiraho kugirango utangaze paki yawe. Hanyuma, buri gusunika kumashami bizaba: kurekura.yaml create-release-pull-request-or-publish nimpinduka / ibikorwa NPM_TOKEN main . Reba niba hari inyandiko zahinduwe Niba impinduka zimpapuro zihari, igikorwa kirema icyifuzo cyo gukurura hamwe nibikenewe bya verisiyo ikenewe hamwe namakuru agezweho. Niba nta gihindutse kibonetse, ntakintu kibaho. . Reba niba hari paki ziteguye gutangaza Niba paki ziteguye gusohoka, igikorwa gitangaza verisiyo nshya kuri NPM ukoresheje yatanzwe. Niba nta paki ziteguye gutangaza, ibikorwa birasohoka nta gihindutse. NPM_TOKEN Muguhindura iyi mirimo, Impinduka zemeza ko gusohora kwawe guhoraho kandi kwizewe, kugabanya ubushobozi bwikosa ryabantu no koroshya ibikorwa byiterambere. Gukora Kumurimo hamwe na GitHub Ibikorwa Iki gice cyibanze muburyo bwo kurekura imbaraga zubwubatsi tumaze kubaka. Ukoresheje ibikorwa bya GitHub, tuzahindura PR kugenzura ubuziranenge bwa PR, gusohora verisiyo kubitabo nibiranga, hamwe no kohereza porogaramu. Icyibandwaho ni ugukwirakwiza automatike mugihe ukomeza kode nziza hamwe nakazi keza. Kugenzura ubuziranenge bwa PR Kugirango tumenye neza ko gukurura gusaba kode bigumaho kandi bihamye, dukora bwabigenewe.yaml akazi. Uru rugendo rukora imirimo myinshi, nko kwemeza ko impinduka zintoki zidatangijwe (kuva verisiyo iyobowe na Changesets): ubuziranenge - id: check_version name: Check version changes run: | BASE_BRANCH=${{ github.event.pull_request.base.ref }} git fetch origin $BASE_BRANCH CHANGED_FILES=$(git diff --name-only origin/$BASE_BRANCH HEAD) VERSION_CHANGED=false for FILE in $CHANGED_FILES; do if [[ $FILE == */package.json ]]; then if [ -f "$FILE" ]; then HEAD_VERSION=$(grep '"version":' "$FILE" | awk -F '"' '{print $4}') else continue fi HEAD_VERSION=$(cat $FILE | grep '"version":' | awk -F '"' '{print $4}') if git cat-file -e origin/$BASE_BRANCH:$FILE 2>/dev/null; then BASE_VERSION=$(git show origin/$BASE_BRANCH:$FILE | grep '"version":' | awk -F '"' '{print $4}') else BASE_VERSION=$HEAD_VERSION fi if [ "$BASE_VERSION" != "$HEAD_VERSION" ]; then VERSION_CHANGED=true echo "Version change detected in $FILE" fi fi done if [ "$VERSION_CHANGED" = true ]; then echo "Manual version changes are prohibited. Use changesets instead." exit 1 fi env: GITHUB_REF: ${{ github.ref }} Kuruhande rwiri genzura, ryakazi rishyiraho ubwishingizi, ryemeza imbogamizi, igenzura ryizunguruka kandi rigenzura ubuziranenge bwimyandikire ukoresheje inyandiko twasobanuye mbere hamwe na NX: check-quality - id: install-dependencies name: Install dependencies run: yarn --immutable - id: check-constraints name: Check constraints run: yarn constraints - id: check-circulardeps name: Check circular dependencies run: yarn check-circulardeps:all - id: check-quality name: Check quality run: BASE=origin/${{ github.event.pull_request.base.ref }} yarn quality:affected Kugenzura ubuziranenge byashizweho kugirango bikore gusa kubipaki byatewe no gusaba gukurura. Kurangiza neza iyi mirimo byerekana gukurura ibyifuzo byiteguye guhuza (usibye kwakira kode isubiramo). Niba igenzura ryinyongera risabwa kumushinga wawe, urashobora kuvugurura hamwe ninyandiko nziza ituma ibikorwa bidahinduka. nx.json Tangaza amasomero n'ibiranga PR imaze guhuzwa, kurekura akazi (nkuko byasobanuwe mumutwe uhindura). Uru rugendo rwubaka rwubatswe kandi rukora PR hamwe na verisiyo ya bump. Iyo PR imaze kwemezwa no guhuzwa, irongera ikora - iki gihe, aho gukora PR, itahura impinduka za verisiyo kandi irekura paki zavuguruwe kuri NPM: kurekura.yaml - id: build-packages name: Build packages run: yarn build:affected - id: create-release-pull-request-or-publish name: Create Release Pull Request or Publish to NPM uses: changesets/action@v1 with: version: yarn changeset version publish: yarn release commit: "chore: publish new release" title: "chore: publish new release" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} release-apps: needs: release-libs-features uses: ./.github/workflows/release-apps.yaml with: publishedPackages: ${{ needs.release-libs-features.outputs.publishedPackages }} Gukurikira ibi, akazi kitwa karakorwa, ishinzwe kohereza porogaramu. Yakiriye urutonde rwibitabo byatangajwe kuva ku ntambwe ibanziriza kandi bituzanira mu gice gikurikira. release-apps Tangaza porogaramu Igice cya nyuma cyibikorwa byo kurekura kirimo kohereza porogaramu zawe (porogaramu ntizisohoka kuri NPM, kuko zashyizweho muri ). akazi gahita gaterwa no , cyangwa irashobora gukorwa muburyo butaziguye uhereye kubikorwa bya GitHub: private package.json Kurekura-porogaramu.yaml kurekurwa.yaml name: Release Apps on: workflow_call: inputs: publishedPackages: description: "List of published packages" required: false type: string default: "[]" workflow_dispatch: inputs: publishedPackages: description: "List of published packages (optional)" required: false type: string default: "[]" Uru rugendo rwakazi yinjijwe kugirango umenye ibipapuro byasohotse. Ukoresheje ingamba za matrix, iragenzura buri progaramu ya matrix kugirango habeho kwishingirwa byatangajwe: publishedPackages - id: check-dependency-published name: Check if any app dependency is published run: | PUBLISHED_PACKAGES="${{ inputs.publishedPackages }}" PACKAGE_NAME="${{ matrix.package }}" APP="${{ matrix.app }}" DEPENDENCIES=$(jq -r '.dependencies // {} | keys[]' "apps/$APP/package.json") for DEP in $DEPENDENCIES; do if echo "$PUBLISHED_PACKAGES" | grep -w "$DEP"; then echo "published=true" >> $GITHUB_OUTPUT exit 0 fi done echo "published=false" >> $GITHUB_OUTPUT Iri genzura nimwe mubisabwa kugirango utangire porogaramu. Ibindi bisabwa byemeza ko verisiyo ya porogaramu yahinduwe (byerekana ko gusubiramo ari ngombwa nubwo nta bisabwa byavuguruwe): - id: check-version-change name: Check if app version has changed run: | APP="${{ matrix.app }}" PACKAGE_JSON_PATH="apps/$APP/package.json" CURRENT_VERSION=$(jq -r '.version' "$PACKAGE_JSON_PATH") PREVIOUS_VERSION=$(git show HEAD~1:"$PACKAGE_JSON_PATH" | jq -r '.version' || echo "") if [[ "$CURRENT_VERSION" == "$PREVIOUS_VERSION" ]]; then echo "changed=false" >> $GITHUB_OUTPUT else echo "changed=true" >> $GITHUB_OUTPUT fi Hanyuma, nyuma yo kwemeza ko porogaramu yaba yaravuguruye biterwa cyangwa verisiyo yayo yarahindutse, urujya n'uruza rw'akazi rugarura verisiyo nshya hanyuma rugakomeza kubaka no gukoresha porogaramu: - id: set-up-docker name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - id: get-app-version name: Get the app version from package.json run: echo "app-version=$(cat ./apps/${{ matrix.app }}/package.json | jq -r '.version')" >> $GITHUB_OUTPUT - id: build-image name: Build image if: steps.check-dependency-published.outputs.published == 'true' || steps.check-version-change.outputs.changed == 'true' uses: docker/build-push-action@v4 with: build-contexts: | workspace=./ context: "./apps/${{ matrix.app }}" load: true push: false tags: | ${{ matrix.app }}:v${{ steps.get-app-version.outputs.app-version }} Muriyi ngero, twubaka ishusho ya Docker tutayisunitse kuri rejisitiri. Mubikorwa byawe byo gukora, simbuza iyi ntambwe hamwe nuburyo bwo kohereza. Umwanzuro Ongera usubiremo imyitozo myiza Muri iyi ngingo yose, twasuzumye imiterere ya monorepo ikomeye nibikoresho bifasha kuyicunga neza. Muguhuza codebase yawe, ntabwo worohereza gusa imiyoborere yo kwishingikiriza gusa ahubwo unoroshya ubufatanye mumakipe. Twerekanye uburyo Yarn ishobora gukoreshwa kugirango dusangire ibintu biterwa, kwihutisha kwishyiriraho na PnP no kunoza imishinga muri rusange. Byongeye kandi, guhuza NX kubikorwa bigenewe inyandiko byerekana ko CI yihuta kandi neza. Impinduka zafashaga guhinduranya verisiyo, kugabanya amakosa yintoki no koroshya ibyasohotse. Hanyuma, twakoze umusaruro-witeguye CI / CD umuyoboro hamwe nibikorwa bya GitHub ikora imirimo ikenewe gusa. Intambwe Zikurikira : Tangira ushyiraho monorepo ntoya kugirango ugerageze imikorere myiza. Iperereza hamwe nububiko butandukanye, hanyuma buhoro buhoro wagure kugirango ushiremo paki nyinshi uko icyizere cyawe kigenda cyiyongera. Ubushakashatsi no Guhuza : Tekereza guhuza ibikoresho byuzuzanya nka PNPM cyangwa Turborepo ukurikije umushinga wawe udasanzwe hamwe nibyifuzo byitsinda. Kwinjiza ibikoresho byinyongera : Hindura neza ibikorwa byawe bya GitHub kugirango ushiremo igenzura ryiza ryiza, gukwirakwiza kode, hamwe na scan yumutekano ijyanye numushinga wawe. Kongera imiyoboro ya CI / CD : Komeza kuvugururwa hamwe nibisohoka bya Yarn, NX, na Changesets. Ihuze nabaturage kugirango dusangire ubushishozi kandi wige kubyerekezo bigenda bigaragara mubuyobozi bwa monorepo. Umuganda namakuru agezweho Ibikoresho : Ububiko bw'Urugero Kugera kuburugero rwuzuye ububiko bwakozwe kubuyobora. Shakisha imiterere yumushinga, kode ntangarugero, hamwe ninyandiko zerekana monorepo yashizweho mubikorwa. : Amapaki ya NPM yatangajwe Reba pake nyayo ya NPM yatangajwe nkigice cyuyu mushinga. Izi paki zerekana imikoreshereze nyayo yisi no gushyira mubikorwa ibitekerezo byaganiriweho mu ngingo.