پرش به مطلب اصلی

استقرار از Monorepo

🖼
تصویر: استقرار Monorepo در ابرکلیکplaceholder — تصویر را اینجا جایگزین کنید

ابرکلیک از استقرار یک زیرپوشه‌ی خاص از یک monorepo بزرگ‌تر پشتیبانی می‌کند. این قابلیت به شما امکان می‌دهد بدون نیاز به جدا کردن مخزن‌ها، هر اپلیکیشن درون monorepo را به‌صورت مستقل استقرار دهید.

مفهوم root_dir

فیلد root_dir مشخص می‌کند کدام زیرپوشه از مخزن شما به‌عنوان ریشه‌ی build و استقرار در نظر گرفته شود. تنها محتوای همان پوشه آپلود می‌شود — نه کل مخزن.

اطلاع

Build context = root_dir. فقط محتوای پوشه‌ی root_dir به سرور آپلود می‌شود. فایل‌های خارج از آن پوشه در دسترس build قرار ندارند.

روش‌های تنظیم root_dir

۱. فایل abrclick.json

فایل abrclick.json را در ریشه‌ی مخزن (نه root_dir) ایجاد کنید:

{
"app": "my-api",
"root_dir": "apps/api"
}

با این روش، هر بار که abrclick deploy را اجرا می‌کنید، مقدار root_dir به‌صورت خودکار اعمال می‌شود.

۲. فلگ CLI

می‌توانید مستقیماً در دستور deploy مسیر را مشخص کنید:

abrclick deploy --root-dir apps/web

۳. تنظیمات اپ در داشبورد

در داشبورد ابرکلیک، به بخش Settings اپ مربوطه بروید و فیلد Root Directory را پر کنید.


ساخت اپ با root_dir

هنگام ایجاد اپ جدید، می‌توانید root_dir را از همان ابتدا تنظیم کنید:

abrclick apps create --name api --runtime nodejs --root-dir apps/api
abrclick apps create --name frontend --runtime nodejs --root-dir apps/frontend

مثال‌های رایج

pnpm Workspace

ساختار معمول یک pnpm workspace:

my-monorepo/
├── pnpm-workspace.yaml
├── package.json
├── apps/
│ ├── api/
│ │ ├── package.json
│ │ └── src/
│ └── web/
│ ├── package.json
│ └── src/
└── packages/
└── shared/

استقرار سرویس api:

abrclick deploy --root-dir apps/api

یا در abrclick.json:

{
"app": "my-api",
"root_dir": "apps/api"
}
pnpm workspaces

برای پروژه‌های pnpm workspace، مطمئن شوید که pnpm-workspace.yaml در root_dir یا در parent directory وجود دارد تا pnpm dependencies را resolve کند.

Turborepo

ساختار معمول یک پروژه‌ی Turborepo:

my-turborepo/
├── turbo.json
├── package.json
├── apps/
│ ├── frontend/
│ │ ├── package.json
│ │ └── src/
│ └── backend/
│ ├── package.json
│ └── src/
└── packages/
└── ui/

استقرار اپ frontend:

abrclick deploy --root-dir apps/frontend

Nx Monorepo

ساختار معمول یک پروژه‌ی Nx:

my-nx-workspace/
├── nx.json
├── package.json
├── apps/
│ ├── service/
│ │ ├── project.json
│ │ └── src/
│ └── admin/
│ ├── project.json
│ └── src/
└── libs/
└── common/

استقرار سرویس service:

abrclick deploy --root-dir apps/service

هر اپ = یک اپلیکیشن مستقل

هر برنامه در monorepo باید به‌عنوان یک اپلیکیشن جداگانه در ابرکلیک تعریف شود و استقرار مستقل داشته باشد.

# ساخت اپ‌های جداگانه برای هر سرویس
abrclick apps create --name my-api --runtime nodejs --root-dir apps/api
abrclick apps create --name my-frontend --runtime nodejs --root-dir apps/frontend
abrclick apps create --name my-worker --runtime nodejs --root-dir apps/worker

هر اپ آدرس مستقل خود را دارد:

https://my-api.apps.abrclick.cloud
https://my-frontend.apps.abrclick.cloud
https://my-worker.apps.abrclick.cloud

مدیریت Shared Packages

مهم

چون فقط محتوای root_dir آپلود می‌شود، پکیج‌های مشترک (مثل packages/shared) در دسترس build قرار ندارند.

برای استفاده از کد مشترک، یکی از روش‌های زیر را به‌کار ببرید:

۱. Bundle کردن پکیج‌های مشترک:

قبل از استقرار، پکیج‌های مشترک را با ابزارهایی مثل tsup یا esbuild bundle کرده و خروجی را درون root_dir قرار دهید.

۲. انتشار پکیج در رجیستری:

پکیج مشترک را در npm (یا رجیستری خصوصی خود) منتشر کنید و در package.json اپ به‌عنوان dependency معمول اضافه کنید:

{
"dependencies": {
"@my-org/shared": "1.0.0"
}
}

۳. استفاده از Dockerfile سفارشی:

یک Dockerfile سفارشی در root_dir بنویسید که با COPY فایل‌های مورد نیاز از پوشه‌های دیگر را نیز کپی کند. در این حالت، build context کل مخزن خواهد بود.

اطلاع

اگر Dockerfile در root_dir وجود داشته باشد، ابرکلیک از آن استفاده می‌کند و build context به ریشه‌ی کل آپلود تغییر می‌کند.