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

بستهٔ راه‌حل

شناسهٔ شِما: solution-package@1 شِمای قابل‌خواندن توسط ماشین: solution-package.schema.json

بازنمایی مرجع و متنی یک راه‌حل خروجی‌گرفته‌شده. بستهٔ راه‌حل واحد ارتقای میان محیط‌هاست: با خروجی گرفتن از یک راه‌حل در محیط مبدأ تولید و با وارد کردن آن در محیط مقصد مصرف می‌شود. بسته خودتوصیف است — هم مانیفست (اینکه راه‌حل چه اجزایی را دربردارد) و هم تعریف‌های مرجعِ جاسازی‌شدهٔ هر جزء Model-Driven را حمل می‌کند، تا یک وارد کردن، موجودیت‌ها، فرم‌ها، نماها و گام‌های افزونهٔ واقعی را از نو بسازد، نه ارجاع‌هایی معلق.

اعتبارسنجی برای هر مبدأیی به شکل یکسان اعمال می‌شود: بسته‌ای که ابزار خروجی گرفتن ساخته، یا یک فراخوانی API ارسال کرده، یا یک دستیار هوش مصنوعی تولید کرده، پیش از آنکه خط لولهٔ استقرار به محیط مقصد دست بزند، در برابر همین شِما اعتبارسنجی می‌شود. فایلی دست‌نویس یا تولیدشده که با این شِما سازگار باشد، وارد کردنش بی‌خطر است.

شکل​

یک بسته، یک شیء JSON با این اعضا است:

فیلدنوعاجبارییادداشت‌ها
formatVersionintegerبلهنسخهٔ قالب بسته. در حال حاضر 1.
publisherNamestringبلهنام نمایشی ناشر مالک.
publisherPrefixstringبلهپیشوند کوتاه و کوچک ناشر (مثلاً par). اگر در مستأجر مقصد نباشد، هنگام وارد کردن از نو ساخته می‌شود.
solutionNamestringبلهنام راه‌حل.
versionstringبلهنسخهٔ معنایی major.minor.patch (مثلاً 1.0.0).
descriptionstring | nullخیرتوصیف اختیاری راه‌حل.
requiresآرایه یا nullخیرراه‌حل‌هایی که این یکی روی آن‌ها ساخته شده: { solutionName, minVersion? }. پیش از نوشتن هر چیز با محیط مقصد سنجیده می‌شود؛ نبودن یا قدیمی بودن یکی، وارد کردن را رد می‌کند.
componentsarrayبلهمانیفست: یک ورودی برای هر جزء (نوع + نام منطقی).
modelComponentsobjectبلهتعریف‌های مرجعِ جاسازی‌شده، گروه‌بندی‌شده بر پایهٔ نوع.
customAppsarray | nullخیرمانیفست‌های برنامهٔ سفارشی جاسازی‌شده. اختیاری است تا بسته‌هایی که پیش از وجود برنامه‌های سفارشی تولید شده‌اند همچنان اعتبارسنجی شوند؛ هر آیتم هنگام ساخت واقعی، افزون بر این، در برابر custom-app-manifest@1 اعتبارسنجی می‌شود.
webResourcesarray | nullخیرمنابع وب جاسازی‌شده (بخش 6.15): فایل‌های برنامه که در پایگاه داده ذخیره می‌شوند و هرکدام content خود را حمل می‌کنند (متن UTF-8 برای انواع متنی، Base64 برای دودویی). اختیاری است تا بسته‌های قدیمی‌تر همچنان اعتبارسنجی شوند؛ فراداده‌های هر آیتم دوباره در برابر web-resource-manifest@1 اعتبارسنجی و هش محتوایش هنگام ساخت واقعی وارسی می‌شود.
customControlsarray | nullخیرکنترل‌های سفارشی نهفته (§۲۸)، که هر یک تمام بایگانی ساختش را با کدگذاری Base64 همراه دارد، تا کد یک کنترل با راه‌حل جابه‌جا شود نه اینکه از میزبانی بیرونی گرفته شود. مانیفست هر درایه هنگام تحقق افزون بر این در برابر custom-control-manifest@1 اعتبارسنجی می‌شود و بایگانی‌اش در برابر contentHash اعلام‌شده وارسی — همان نقطه‌ای که نشان می‌دهد کدی که بازبینی شد و کدی که اجرا می‌شود یکی‌اند.

جزء مانیفست (components[])​

فیلدنوعاجبارییادداشت‌ها
componentTypestringبلهیکی از Entity، Form، View، App، CustomApp، CustomControl، Process، Report، WebResource، PolicyDefinition، SecurityRole، SavedQuery، Dashboard، BusinessRule، Script. (App نقشهٔ ناوبری یک اپ مدل‌محور است و CustomApp یک اپ React دست‌نویس.)
logicalNamestringبلهپیشوند ناشر در ابتدا؛ حروف کوچک، با اجازهٔ _، .، /، - برای نام‌های مسیرمانند منابع وب (مثلاً par_invoice، par_/dashboard/app.js).
componentReferenceIdstring | nullخیرشناسهٔ خود جزء در زیرسامانه‌اش، اگر داشته باشد.

تعریف‌های جاسازی‌شده (modelComponents)​

شیئی با آرایه‌هایی از ورودی‌های تعریف جزء — entities، forms، views، pluginSteps، و apps اختیاری (برنامه‌های Model-Driven). ترتیب، مقصود وابستگی را حمل می‌کند: نخست موجودیت‌ها ساخته می‌شوند، سپس فرم‌ها/نماها/گام‌های افزونه، و سپس برنامه‌ها (که ناوبری‌شان با نام منطقی به موجودیت‌ها ارجاع می‌دهد). apps اختیاری است تا بسته‌ای که پیش از سفر کردن برنامه‌ها تولید شده همچنان اعتبارسنجی و وارد شود.

seedData (اختیاری) تنها فهرستی است که ورودی‌هایش رکورد هستند نه تعریف: به ازای هر جدول یک سند seed-data@1 — با نام منطقی جدول در هر دو جایگاه logicalName و entity — که رکوردهایی را نگه می‌دارد که نمای داده‌های اولیهٔ جدول هنگام خروجی گرفتن برگردانده است. درون‌ریزی آن را پس از همه‌چیز می‌سازد و هر رکورد را بر اساس id از مسیر عادی نوشتن رکورد درج یا به‌روز می‌کند، فقط ستون‌هایی را که رکورد حمل می‌کند می‌نویسد و هرگز چیزی حذف نمی‌کند؛ رکوردی که مقصد رد کند رد می‌شود و در جزئیات وضعیت درون‌ریزی نام برده می‌شود. ببینید ارسال داده‌های اولیه همراه راه‌حل.

فیلدنوعاجبارییادداشت‌ها
logicalNamestringبلهنام منطقی جزء.
entitystringبلهنام منطقی موجودیت مالک (برای یک موجودیت، نام خودش).
jsonstringبلهتعریف JSON مرجع جزء (یک تعریف موجودیت، فرم، نما، یا پوشش گام افزونه — هرکدام هنگام ساخت واقعی در برابر شِمای خودش اعتبارسنجی می‌شود).
isDefaultbooleanخیربرای فرم‌ها/نماها: اینکه آیا این پیش‌فرض موجودیت است.

یک مسیر اعتبارسنجی. بار json هر جزء جاسازی‌شده توسط این شِمای بسته دوباره اعتبارسنجی نمی‌شود؛ در عوض هرکدام همچنان که ساخته می‌شود در برابر شِمای منتشرشدهٔ خودش اعتبارسنجی می‌گردد (برای نمونه تعریف موجودیت Model-Driven، فرم، نما، گام افزونه) — همان وارسی‌ای که یک ذخیرهٔ طراح انجام می‌دهد.

نمونه​

{
"formatVersion": 1,
"publisherName": "Parsware",
"publisherPrefix": "par",
"solutionName": "Sales",
"version": "1.0.0",
"description": "Core sales entities.",
"components": [
{ "componentType": "Entity", "logicalName": "par_invoice" },
{ "componentType": "Form", "logicalName": "par_invoice_main" }
],
"modelComponents": {
"entities": [
{ "logicalName": "par_invoice", "entity": "par_invoice", "json": "{ ...entity definition... }" }
],
"forms": [
{ "logicalName": "par_invoice_main", "entity": "par_invoice", "json": "{ ...form definition... }", "isDefault": true }
],
"views": [],
"pluginSteps": []
}
}

چگونه به کار می‌رود​

  • خروجی گرفتن مانیفست و تعریف‌های واقعی را از یک محیط مبدأ می‌خواند و بسته‌ای در GET /solutions/{id}/export?sourceEnvironmentId=… تولید می‌کند.
  • وارد کردن بسته را در برابر این شِما اعتبارسنجی می‌کند، وابستگی‌ها را رفع می‌کند (هر فرم/نما/گام افزونه باید موجودیتی را هدف بگیرد که در همان بسته آمده است)، از هر دروازهٔ تأییدی می‌گذرد، و سپس اجزا را در شِمای ایزولهٔ محیط مقصد می‌سازد — در POST /solution-imports.

نسخه‌گذاری​

نسخه‌های قدیمی‌تر شِما کنار نسخه‌های تازه نگه داشته می‌شوند تا راه‌حل‌هایی که از پیش مستقر شده‌اند، پس از تحول شِما همچنان اعتبارسنجی شوند. تغییری شکننده به جای ویرایش این نسخه، به‌صورت نسخه‌ای تازه (solution-package@2) منتشر می‌شود؛ یک بسته formatVersion خودش را حمل می‌کند تا خط لوله بتواند نسخه‌ای را که پشتیبانی نمی‌کند رد کند.