513 gusoma
513 gusoma

Kubaka JS / TS Monorepo: Imyitozo myiza hamwe na Yarn, NX na Changesets

na Teimur Gasanov22m2025/03/24
Read on Terminal Reader

Birebire cyane; Gusoma

Iyi ngingo isobanura uburyo bwo kubaka monorepo ikomeye ya JS / TS ukoresheje Yarn v4 kumwanya wakazi, NX mugukora neza inyandiko no gucunga neza, hamwe na Changesets yo guhinduranya no gusohora. Irimo kandi gutunganya kode yawe muri porogaramu, Ibiranga, na Libs, hiyongereyeho guhuza ibikorwa bya GitHub kuri CI / CD kugirango urebe neza ubuziranenge bwa kode kandi byoroshye kohereza.
featured image - Kubaka JS / TS Monorepo: Imyitozo myiza hamwe na Yarn, NX na Changesets
Teimur Gasanov HackerNoon profile picture
0-item
1-item

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 inzitizi (amategeko) kandi ukoreshe amacomeka menshi aboneka kugirango ukomeze guhuzagurika.


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, PNPM na Turborepo nibindi bikoresho bigezweho bitanga ibintu byinshi biranga.

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 Express API yoroshye yo kwemeza abakoresha. Porogaramu ya seriveri yerekana impera imwe ( /auth/signIn ) ikoresha umukoresha kuva mubindi bikoresho.

 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, /auth/signIn mpera ikoresha umukoresha watumijwe mubindi bikoresho. Ibyo bituzanira ibice bikurikira: ibiranga seriveri.

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 SignInForm bitumizwa mubikoresho byabakiriya biranga, bituganisha kumurongo wanyuma.

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 yukwemeza kuva libs dusangiye, tukemeza ko logique yo kwemeza iri hagati kandi ikabikwa byoroshye.


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 gukoresha inyandiko zinyandiko nyinshi ukoresheje ibintu bitandukanye, birashobora gusaba inyandiko yihariye kugirango igenzure byinshi. Aha niho NX ije: itanga ibisubizo-byo-bisubizo kugirango bikorwe neza, bigamije inyandiko.

Intangiriro kuri NX

NX ni sisitemu yo kubaka yatunganijwe kuri monorepos ifite ubushobozi bwa CI buhanitse. Hamwe na NX, urashobora:

  • Koresha imirimo neza muburyo bubangikanye : Koresha guhuza kugirango wihutishe kubaka.
  • Menya isano yo kwishingikiriza : Sobanukirwa n'amasano hagati yamapaki ninyandiko.
  • Cache inyandiko yo gukora ibisubizo : Irinde akazi karenze muguhisha ibisubizo.
  • Hindura imyitwarire hamwe namacomeka: Kwagura imikorere ukoresheje ecosystem ikungahaye kumacomeka .

Intego yo Gushyira mu bikorwa

Kugirango dukoreshe ubushobozi bwa NX, dukeneye mbere na mbere gukora dosiye nx.json kugirango dusobanure amategeko agenga inyandiko zacu. Hasi ni urugero rwiboneza:

 { "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

    build inyandiko ya pake biterwa nubwubatsi bwubaka bushingiye, kandi ibisohoka ni cashe.

  • Kwandika

    Imyandikire typecheck ya paki biterwa nubwubatsi hamwe nimyandikire yimyandikire yabyo.

  • Lint

    Inyandiko lint ya paki iterwa nuburyo bwubaka hamwe na linti yinyandiko zishingiye.


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:

  • kubaka: Yubaka paki.

  • Imyandikire: Kugenzura ubwoko bwa paki.

  • lint: Yerekana paki.

  • ubuziranenge: Ikoresha imashini yandika na lint. '


Buri nyandiko ifite ibintu bibiri bitandukanye:

  • byose: Koresha inyandiko kuri paki zose.
  • byagize ingaruka: Koresha inyandiko gusa kuri paki zatewe nimpinduka ziherutse. Ibihinduka BASE na HEAD ibidukikije biguha uburenganzira bwo kwerekana urwego (usanzwe uturuka ku origin/main hamwe na HEAD iriho ubu), bigushoboza gukora granulaire kubisabwa gukurura. Ibi birashobora kubika neza umwanya numutungo.

Gucunga Uruziga

NX itanga kandi amabwiriza-yo kubyara igishushanyo mbonera, gishobora gufasha mukumenya kwizerwa. Inyandiko ikurikira ikoresha ibishushanyo mbonera bya NX kugirango igenzure uruziga kandi birananirana niba hari bibonetse.

Kora dosiye scripts/check-circulardeps.mjs hamwe nibikurikira:

 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 dosiyeyarn.config.cjs kugirango dushimangire guhuza:

  • 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

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:

  • 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 kurekura.yaml akazi keza murugero rwububiko. Ifite create-release-pull-request-or-publish intambwe. Intambwe ishyigikiwe nimpinduka / ibikorwa GitHub ikora amarozi yose. Ukeneye gusa gushiraho NPM_TOKEN kugirango utangaze paki yawe. Hanyuma, buri gusunika kumashami main bizaba:

  • 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 NPM_TOKEN yatanzwe. Niba nta paki ziteguye gutangaza, ibikorwa birasohoka nta gihindutse.


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 ubuziranenge bwabigenewe.yaml akazi. Uru rugendo rukora imirimo myinshi, nko kwemeza ko impinduka zintoki zidatangijwe (kuva verisiyo iyobowe na Changesets):

 - 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, check-quality ryakazi rishyiraho ubwishingizi, ryemeza imbogamizi, igenzura ryizunguruka kandi rigenzura ubuziranenge bwimyandikire ukoresheje inyandiko twasobanuye mbere hamwe na NX:

 - 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 nx.json hamwe ninyandiko nziza ituma ibikorwa bidahinduka.

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, kurekura.yaml irongera ikora - iki gihe, aho gukora PR, itahura impinduka za verisiyo kandi irekura paki zavuguruwe kuri NPM:

 - 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 release-apps karakorwa, ishinzwe kohereza porogaramu. Yakiriye urutonde rwibitabo byatangajwe kuva ku ntambwe ibanziriza kandi bituzanira mu gice gikurikira.

Tangaza porogaramu

Igice cya nyuma cyibikorwa byo kurekura kirimo kohereza porogaramu zawe (porogaramu ntizisohoka kuri NPM, kuko zashyizweho private muri package.json ). Kurekura-porogaramu.yaml akazi gahita gaterwa no kurekurwa.yaml , cyangwa irashobora gukorwa muburyo butaziguye uhereye kubikorwa bya GitHub:

 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 publishedPackages yinjijwe kugirango umenye ibipapuro byasohotse. Ukoresheje ingamba za matrix, iragenzura buri progaramu ya matrix kugirango habeho kwishingirwa byatangajwe:

 - 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

  1. Ubushakashatsi no Guhuza : 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.
  2. Kwinjiza ibikoresho byinyongera : Tekereza guhuza ibikoresho byuzuzanya nka PNPM cyangwa Turborepo ukurikije umushinga wawe udasanzwe hamwe nibyifuzo byitsinda.
  3. Kongera imiyoboro ya CI / CD : Hindura neza ibikorwa byawe bya GitHub kugirango ushiremo igenzura ryiza ryiza, gukwirakwiza kode, hamwe na scan yumutekano ijyanye numushinga wawe.
  4. Umuganda namakuru agezweho : Komeza kuvugururwa hamwe nibisohoka bya Yarn, NX, na Changesets. Ihuze nabaturage kugirango dusangire ubushishozi kandi wige kubyerekezo bigenda bigaragara mubuyobozi bwa monorepo.

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.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks