הגדרת מונוריפו עם Lerna חיונית לניהול חבילות מרובות. הגדרת מונוריפו זו עם Lerna הופכת את ניהול הגרסאות וה-CI/CD לאוטומטיים, ומפחיתה את העבודה הידנית ב-80%. ניהול של עשרות חבילות במאגר יחיד ללא אוטומציה מוביל לכאוס: ניהול גרסאות ידני, התנגשויות תלויות בין חבילות, ושכפול קוד. כל תכונה חדשה דורשת סנכרון של מספר חבילות, מה שלוקח שעות בעבודה ידנית. Lerna פותר בעיות אלו על ידי מתן ממשק אחיד לניהול גרסאות, בנייה ופרסום. הניסיון שלנו כולל למעלה מחמישים פרויקטי מונוריפו, ו-Lerna נותרה הבחירה העיקרית לספריות וכלי עזר המתפרסמים ל-npm. היא הבסיס להרחבת קודבס ללא כאב. להלן פירוט מפורט של איך אנו מגדירים Lerna turnkey: מניתוח ועד CI/CD ותיעוד. קבל ייעוץ מהנדס כדי להעריך אם Lerna מתאימה לפרויקט שלך. לפי lerna.js.org, ניהול גרסאות אוטומטי הוא תכונת ליבה. עם 5+ שנות ניסיון במערכת האקולוגית של JavaScript ו-50+ פרויקטי מונוריפו שהושלמו, הצוות שלנו מבטיח הגדרה חזקה. המחיר מתחיל ב-$2,500 עבור הגדרת מונוריפו בסיסית עם 5 חבילות, עם חיסכון שנתי העולה על $10,000 בזמן פיתוח.
Lerna לעומת Turborepo לעומת Nx
Lerna הגיונית כאשר הפרויקט הוא ספרייה או קבוצת חבילות המתפרסמות ל-npm. היא דורשת ניהול גרסאות אוטומטי (semver) ו-CHANGELOG. הצוות קטן, ותשתית מורכבת מיותרת. עבור מוצרים סגורים ללא פרסום, Turborepo או Nx עדיפות. Lerna 6+ חודשה תחת ניהול Nrwl עם Nx אופציונלי מתחת למכסה המנוע עבור מטמון וביצוע משימות במקביל. חיסכון בזמן בנייה מגיע ל-50% עם 20+ חבילות. ניהול הגרסאות האוטומטי של Lerna מהיר פי 5 מניהול ידני, ומקצר את זמן השחרור מ-4 שעות ל-45 דקות. Lerna עם מטמון Nx עולה על בניות ידניות ב-70%.
הגדרת Lerna: תהליך שלב אחר שלב
- ניתוח והגדרה: קבע מצב (independent או fixed), בחר מנהל חבילות (pnpm מומלץ), אתחל Lerna, הגדר commitlint ו-husky.
-
מבנה המאגר: ארגן חבילות תחת
npx lerna init --packages="packages/*" --independentואפליקציית תיעוד תחת{ "$schema": "node_modules/lerna/schemas/lerna-schema.json", "version": "independent", "npmClient": "pnpm", "command": { "publish": { "conventionalCommits": true, "createRelease": "github", "message": "chore(release): publish", "registry": "https://registry.npmjs.org", "allowBranch": ["main", "next"] }, "version": { "conventionalCommits": true, "conventionalChangelogConfig": "@conventional-changelog/conventionalcommits", "changelogPreset": "angular", "gitTagVersion": true, "push": true }, "bootstrap": { "npmClientArgs": ["--no-package-lock"] } }, "useWorkspaces": true, "useNx": true }. - צינור CI/CD: הגדר GitHub Actions לפרסום אוטומטי במיזוג ל-main.
- הכשרת צוות: סשן הדגמה של 2-3 שעות על conventional commits ותהליך השחרור.
npx lerna init --packages="packages/*" --independent דוגמה ל-lerna.json:
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "independent",
"npmClient": "pnpm",
"command": {
"publish": {
"conventionalCommits": true,
"createRelease": "github",
"message": "chore(release): publish",
"registry": "https://registry.npmjs.org",
"allowBranch": ["main", "next"]
},
"version": {
"conventionalCommits": true,
"conventionalChangelogConfig": "@conventional-changelog/conventionalcommits",
"changelogPreset": "angular",
"gitTagVersion": true,
"push": true
},
"bootstrap": {
"npmClientArgs": ["--no-package-lock"]
}
},
"useWorkspaces": true,
"useNx": true
} מבנה המאגר
אנו מארגנים חבילות תחת packages/: לדוגמה, button, input, modal. כל חבילה היא יחידה עצמאית עם tsconfig ובדיקות משלה. לתיעוד, אנו משתמשים ב-apps/docs (Storybook).
my-ui-library/
├── packages/
│ ├── button/
│ ├── input/
│ ├── modal/
│ ├── table/
│ └── theme/
├── apps/
│ └── docs/
├── package.json
├── lerna.json
└── pnpm-workspace.yaml ניהול גרסאות ופרסום
| פקודה | תיאור |
|---|---|
my-ui-library/ ├── packages/ │ ├── button/ │ ├── input/ │ ├── modal/ │ ├── table/ │ └── theme/ ├── apps/ │ └── docs/ ├── package.json ├── lerna.json └── pnpm-workspace.yaml | מציג חבילות ששונו |
lerna changed | מעדכן גרסאות באופן אינטראקטיבי |
lerna version | אוטומטי בהתבסס על conventional commits |
lerna version --conventional-commits --yes | מפרסם את כל החבילות שלא פורסמו |
lerna publish from-package | מפרסם חבילות שעבורן קיימים תגי git |
בעת הרצת lerna publish from-git, Lerna מזהה חבילות ששונו, מציעה גרסאות חדשות לפי semver, מעדכנת את package.json ותלויות בין-חבילות, יוצרת CHANGELOG.md, ויוצרת commit ותגי git. התהליך כולו אורך פחות מ-5 דקות עבור 20 חבילות.
אינטגרציית CI/CD עם Lerna
הצינור בנוי על GitHub Actions או GitLab CI. הנקודה המרכזית היא פרסום אוטומטי רק במיזוג ל-main. אנו משתמשים ב-lerna version ליצירת גרסאות ו-changelogs, ולאחר מכן ב-lerna version --conventional-commits --yes לפרסום. להרחבה, אנו מאפשרים lerna publish from-git — זה מספק מטמון וביצוע משימות במקביל, ומקצר את זמן הבנייה ל-10 דקות אפילו עם 50+ חבילות. כתוצאה מכך, שחרור אורך 15 דקות במקום מספר שעות, ומקצץ בעלויות CI/CD ב-30–40%. עם הפחתה של 95% בשגיאות אנוש, שחרורים אמינים.
---
# .github/workflows/release.yml
name: Release
on:
push:
branches: [main]
permissions:
contents: write
packages: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- uses: pnpm/action-setup@v3
- uses: actions/setup-node@v4
with:
node-version: 20
registry-url: 'https://registry.npmjs.org'
- run: pnpm install --frozen-lockfile
- name: Build all packages
run: npx lerna run build
- name: Version and publish
run: |
git config user.email "[email protected]"
git config user.name "CI Bot"
npx lerna version --conventional-commits --yes --no-push
npx lerna publish from-git --yes
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
---
הרצת משימות עם Nx מתחת למכסה המנוע
Lerna 6+ משתמשת ב-Nx לביצוע חכם:
npx lerna run build npx lerna run test --since=main npx lerna run build --scope=@acme/modal --include-dependents מטמון Nx מאפשר שימוש חוזר בתוצאות בנייה, וחוסך עד 70% זמן בריצות עוקבות. זה חשוב במיוחד עבור מונוריפוס גדולים עם מאות חבילות.
מצב Independent או Fixed?
עבור ספריות רכיבים או כלי עזר המשוחררות באופן אסינכרוני, מצב independent הוא הבחירה ההגיונית היחידה. כל חבילה מנוהלת בגרסה עצמאית, מה שמאפשר תיקוני באגים בחבילה אחת מבלי להשפיע על אחרות. במצב fixed (כמו ב-React או Vue), כל החבילות מסונכרנות — פשוט יותר אך פחות גמיש. אנו ממליצים על מצב independent עבור פרויקטים עם תדירויות שחרור משתנות. זמן שנחסך בתיאום גרסאות הוא 2-3 שעות בשבוע.
מה כלול בהגדרה
- מונוריפו מוגדר במלואו עם Lerna ומנהל החבילות שבחרת (pnpm/npm/yarn)
- צינור CI/CD (GitHub Actions או GitLab CI) לפרסום אוטומטי במיזוג ל-main
- תיעוד תהליך השחרור עם כללי conventional commit
- הכשרת צוות (סשן הדגמה של 2–4 שעות)
- תמיכה למשך שבועיים לאחר היישום: תיקוני באגים, ייעוץ
החזר ההשקעה עבור הגדרה זו הוא פחות מ-3 חודשים הודות להפחתת העבודה הידנית ושגיאות השחרור.
מלכודות אופייניות
בעת עדכון גרסה דרך useNx: true, ייתכן שתלות לא תתעדכן אם צוין טווח רך (^ או ~). הדגל # .github/workflows/release.yml name: Release on: push: branches: [main] permissions: contents: write packages: write jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - uses: pnpm/action-setup@v3 - uses: actions/setup-node@v4 with: node-version: 20 registry-url: 'https://registry.npmjs.org' - run: pnpm install --frozen-lockfile - name: Build all packages run: npx lerna run build - name: Version and publish run: | git config user.email "[email protected]" git config user.name "CI Bot" npx lerna version --conventional-commits --yes --no-push npx lerna publish from-git --yes env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} מאלץ עדכון של כל החבילות, וגרסאות מקודדות (ללא caret) מבטיחות עדכונים. ה-CHANGELOG עשוי לשכפל ערכים — השתמש ב-npx lerna run build npx lerna run test --since=main npx lerna run build --scope=@acme/modal --include-dependents אם נדרשים root commits. פרסום ב-CI עלול להיכשל עקב lerna version ב---force-publish — ודא ש---changelog-include-commits-root-path קיים בסביבת ה-CI.
לוחות זמנים ועלות
הגדרת Lerna עבור קבוצת חבילות npm מאפס אורכת 2 עד 5 ימים בהתאם למורכבות. העלות מחושבת באופן אישי. המחיר מתחיל ב-$2,500. צור קשר להערכת פרויקט וקבל ייעוץ מהנדס עם שנים של ניסיון במערכת האקולוגית של JavaScript. הזמן הגדרת מונוריפו turnkey וראה את היעילות של האוטומציה.







