Skip to content

يدعم Bun workspaces في package.json. تجعل مساحات العمل من السهل تطوير البرامج المعقدة كـ monorepo تتكون من عدة حزم مستقلة.

من الشائع أن يحتوي monorepo على الهيكل التالي:

txt
<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.

json
{
  "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) للحصول على قائمة شاملة بالنمط المدعوم.
json
{
  "name": "my-project",
  "version": "1.0.0",
  "workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}

كل مساحة عمل لها package.json الخاص بها. عند الرجوع إلى الحزم الأخرى في monorepo، يمكن استخدام semver أو بروتوكولات مساحة العمل (مثل workspace:*) كحقل الإصدار في package.json الخاص بك.

json
{
  "name": "pkg-a",
  "version": "1.0.0",
  "dependencies": {
    "pkg-b": "workspace:*"
  }
}

سيقوم bun install بتثبيت التبعيات لجميع مساحات العمل في monorepo، مع إزالة التكرار من الحزم إذا أمكن. إذا كنت تريد تثبيت التبعيات لمساحات عمل محددة فقط، يمكنك استخدام العلامة --filter.

bash
# تثبيت التبعيات لجميع مساحات العمل التي تبدأ بـ `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

Bun بواسطة www.bunjs.com.cn تحرير