يدعم Bun workspaces في package.json. تجعل مساحات العمل من السهل تطوير البرامج المعقدة كـ monorepo تتكون من عدة حزم مستقلة.
من الشائع أن يحتوي monorepo على الهيكل التالي:
<root>
├── README.md
├── bun.lock
├── package.json
├── tsconfig.json
└── packages
├── pkg-a
│ ├── index.ts
│ ├── package.json
│ └── tsconfig.json
├── pkg-b
│ ├── index.ts
│ ├── package.json
│ └── tsconfig.json
└── pkg-c
├── index.ts
├── package.json
└── tsconfig.jsonفي package.json الجذر، يُستخدم مفتاح "workspaces" للإشارة إلى الأدلة الفرعية التي يجب اعتبارها حزمًا/مساحات عمل داخل monorepo. من المعتاد وضع جميع مساحة العمل في دليل يسمى packages.
{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/*"],
"devDependencies": {
"example-package-in-monorepo": "workspace:*"
}
}NOTE
**دعم Glob** — يدعم Bun نمط glob الكامل في `"workspaces"`، بما في ذلك الأنماط السلبية (مثل `!**/excluded/**`). راجع [هنا](/ar/runtime/glob#supported-glob-patterns) للحصول على قائمة شاملة بالنمط المدعوم.{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}كل مساحة عمل لها package.json الخاص بها. عند الرجوع إلى الحزم الأخرى في monorepo، يمكن استخدام semver أو بروتوكولات مساحة العمل (مثل workspace:*) كحقل الإصدار في package.json الخاص بك.
{
"name": "pkg-a",
"version": "1.0.0",
"dependencies": {
"pkg-b": "workspace:*"
}
}سيقوم bun install بتثبيت التبعيات لجميع مساحات العمل في monorepo، مع إزالة التكرار من الحزم إذا أمكن. إذا كنت تريد تثبيت التبعيات لمساحات عمل محددة فقط، يمكنك استخدام العلامة --filter.
# تثبيت التبعيات لجميع مساحات العمل التي تبدأ بـ `pkg-` باستثناء `pkg-c`
bun install --filter "pkg-*" --filter "!pkg-c"
# يمكن استخدام المسارات أيضًا. هذا يعادل الأمر أعلاه.
bun install --filter "./packages/pkg-*" --filter "!pkg-c" # أو --filter "!./packages/pkg-c"عند النشر، يتم استبدال إصدارات workspace: بإصدار package.json الخاص بالحزمة،
"workspace:*" -> "1.0.1"
"workspace:^" -> "^1.0.1"
"workspace:~" -> "~1.0.1"تحديد إصدار معين له الأسبقية على إصدار package.json الخاص بالحزمة،
"workspace:1.0.2" -> "1.0.2" // حتى لو كان الإصدار الحالي 1.0.1مساحات العمل لديها بعض الفوائد الرئيسية.
- يمكن تقسيم الكود إلى أجزاء منطقية. إذا اعتمدت حزمة واحدة على أخرى، يمكنك ببساطة إضافتها كتبعية في
package.json. إذا كانت الحزمةbتعتمد علىa، فسيقومbun installبتثبيت دليلpackages/aالمحلي الخاص بك فيnode_modulesبدلاً من تنزيله من سجل npm. - يمكن إزالة تكرار التبعيات. إذا شارك
aوbتبعية مشتركة، فسيتم رفعها إلى مجلدnode_modulesالجذر. هذا يقلل من استخدام القرص الزائد ويقلل من مشاكل "جحيم التبعيات" المرتبطة بتثبيت إصدارات متعددة من حزمة في وقت واحد. - تشغيل النصوص البرمجية في حزم متعددة. يمكنك استخدام العلامة
--filterلتشغيل نصوصpackage.jsonالبرمجية في حزم متعددة في مساحة العمل الخاصة بك بسهولة، أو--workspacesلتشغيل النصوص البرمجية عبر جميع مساحات العمل.
مشاركة الإصدارات مع الكتالوجات
عندما تحتاج العديد من الحزم إلى نفس إصدارات التبعيات، تتيح لك الكتالوجات تعريف تلك الإصدارات مرة واحدة في package.json الجذر والرجوع إليها من مساحات العمل الخاصة بك باستخدام بروتوكول catalog:. تحديث الكتالوج تلقائيًا يحدث كل حزمة تشير إليه. راجع الكتالوجات للحصول على التفاصيل.
NOTE
⚡️ **السرعة** - التثبيتات سريعة، حتى بالنسبة لـ monorepos الكبيرة. يثبت Bun [Remix](https://github.com/remix-run/remix) monorepo في حوالي `500ms` على Linux.- أسرع 28 مرة من
npm install - أسرع 12 مرة من
yarn install(v1) - أسرع 8 مرات من
pnpm install