أداة SolutionPackager

SolutionPackager هي أداة يمكن أن تتحلل بشكل عكسي ملف حل مضغوط Microsoft Dataverse إلى ملفات XML متعددة وملفات أخرى. يمكنك بعد ذلك إدارة هذه الملفات بسهولة باستخدام نظام التحكم بالمصدر. توضح لك الأقسام التالية كيفية تشغيل الأداة وكيفية استخدام الأداة مع الحلول المدارة وغير المدارة.

Important

لم تعد الأداة SolutionPackager الطريقة الموصى بها لفك حزمة الحلول وحزمها. يتم دمج قدرات أداة SolutionPackager في Power Platform CLI. pac solution يحتوي الأمر على العديد من الأفعال بما في ذلك unpackو packcloneو التي sync تتضمن نفس الإمكانات الأساسية لأداة SolutionPackager.

أين تجد أداة SolutionPackager

يتم توزيع أداة SolutionPackager كجزء من حزمة Microsoft.CrmSdk.CoreTools NuGet. لتثبيت البرنامج، اتبع الخطوات التالية.

  1. قم بتنزيل حزمة NuGet.
  2. أعد تسمية ملحق اسم ملف الحزمة من nupkg. إلى zip.
  3. استخرج محتويات الملف المضغوط (zip).

ابحث عن الملف القابل للتنفيذ SolutionPackager.exe في المجلد <extracted-folder-name>/contents/bin/coretools. قم بتشغيل البرنامج من مجلد coretools أو أضف هذا المجلد إلى PATH الخاص بك.

وسيطات سطر أوامر SolutionPackager

SolutionPackager هي أداة سطر أوامر. يمكنك استدعاؤه باستخدام المعلمات الموضحة في الجدول التالي.

الوسيطة الوصف
/action: {Extract|حزمة} مطلوبة. الإجراء الذي يجب القيام به. يمكن أن يكون الإجراء إما لاستخراج حل .zip ملف إلى مجلد، أو لحزم مجلد في ملف .zip.
/zipfile: <مسار الملف> مطلوبة. مسار واسم ملف الحل .zip. عند الاستخراج، يجب أن يكون الملف موجودًا وقابلاً للقراءة. عند التعبئة ، يتم استبدال الملف.
/folder: <مسار المجلد> مطلوبة. المسار إلى مجلد. عند الاستخراج، يتم إنشاء هذا المجلد وتعبئته بملفات المكونات. عند التعبئة، يجب أن يكون هذا المجلد موجودا بالفعل ويحتوي على ملفات مكونات تم استخراجها مسبقا.
/packagetype: {غير مدار|مدارة |كلاهما} اختياري. نوع الحزمة المراد معالجتها. القيمة الافتراضية هي غير مدارة. لا تُضمّن هذه الوسيطة في معظم الحالات لأن الأداة يمكنها قراءة نوع الحزمة من داخل ملف .zip أو ملفات المكونات. عند الاستخراج وإذا كان الخيار Both محددًا، يلزم وجود ملفات zip. المُدارة وغير المُدارة وتتم معالجتها في مجلد واحد. عند إنشاء الحزمة، وإذا كان الخيار "كلاهما" محددًا، سيتم إنتاج ملفات zip. المُدارة وغير المُدارة من مجلد واحد. لمزيد من المعلومات، راجع القسم الخاص بالعمل مع الحلول المُدارة وغير المُدارة لاحقًا في هذا المقال.
/allowWrite:{نعم |لا} اختياري. القيمة الافتراضية هي نعم. استخدم هذه الوسيطة فقط أثناء الاستخراج. عند تحديد /allowWrite:No، تقوم الأداة بتنفيذ جميع العمليات ولكنها لا تكتب أو تحذف أي ملفات. يمكنك تنفيذ عملية الاستخراج بأمان دون الكتابة فوق أي ملفات موجودة أو حذفها.
/allowDelete:{نعم | لا | استفسار} اختياري. القيمة الافتراضية هي Prompt. استخدم هذه الوسيطة فقط أثناء الاستخراج. عند تحديد /allowDelete:Yes، تحذف الأداة تلقائيًا أي ملفات غير متوقعة موجودة في المجلد المحدد بواسطة المعلمة /folder. عند تحديد /allowDelete:No، لا تحذف الأداة أي ملفات. عند تحديد /allowDelete:Prompt، تتم مطالبة المستخدم من خلال وحدة التحكم بالسماح بتنفيذ جميع عمليات الحذف أو رفض السماح بها. إذا قمت بتحديد /allowWrite:No، فلن تحذف الأداة أي ملفات حتى إذا تم تحديد /allowDelete:Yes أيضًا.
/ كلوبر اختياري. استخدم هذه الوسيطة فقط أثناء الاستخراج. عند تحديد /clobber، تقوم الأداة بالكتابة فوق الملفات التي تم تعيين سمة القراءة فقط لها أو حذفها. إذا لم يتم تحديده، لا تقوم الأداة بالكتابة فوق الملفات ذات سمة القراءة فقط أو حذفها.
/errorlevel: {Off|خطأ|تحذير|معلومات|مطول} اختياري. القيمة الافتراضية هي معلومات. تشير هذه الوسيطة إلى مستوى معلومات التسجيل إلى مخرجات.
/map: <مسار الملف> اختياري. مسار واسم ملف .xml يحتوي على توجيهات تعيين الملفات. عند استخدامها أثناء الاستخراج، تقرأ الأداة الملفات التي تُقرأ عادةً من داخل المجلد المحدد بواسطة المعلمة /folder، وذلك من مواقع بديلة كما هو محدد في ملف التعيين. أثناء عملية التحزيم، لا تكتب الأداة الملفات التي تطابق التوجيهات.
/لا شعار اختياري. قم بإخفاء الشعار أثناء التشغيل.
/log: <مسار الملف> اختياري. مسار واسم لملف سجل. إذا كان الملف موجودا بالفعل، إلحاق معلومات تسجيل جديدة بالملف.
@ <مسار الملف> اختياري. مسار واسم لملف يحتوي على وسيطات سطر الأوامر للأداة.
/sourceLoc: <سلسلة> اختياري. يقوم هذا الوسيط بإنشاء ملف مورد قالب، ويكون صالحًا فقط عند الاستخراج.

القيم المحتملة هي auto أو رمز LCID/ISO للغة التي تريد تصديرها. عند استخدام هذه الوسيطة، تستخرج الأداة موارد السلسلة من الإعدادات المحلية المحددة كملف ‎.resx‎ محايد. إذا قمت بتحديد auto أو مجرد الصيغة الطويلة أو القصيرة للمبدّل، يتم استخدام اللغة الأساسية أو الحل. يمكنك استخدام النموذج المختصر للأمر: /src.
/localize اختياري. استخراج أو دمج جميع موارد السلسلة في ملفات .resx. يمكنك استخدام النموذج المختصر للأمر: /loc. يدعم خيار الترجمة المكونات المشتركة لملفات .resx. لمزيد من المعلومات، راجع استخدام موارد ويب RESX.
/SolutionName: <الاسم> اختياري. الاسم الفريد للحل المراد حزمه أو استخراجه عندما يحتوي المجلد المصدر على حلول متعددة ضمن solutions/*/solution.yml. مطلوب عند اكتشاف أكثر من حل واحد. ينطبق فقط على تنسيق التحكم في المصدر YAML. يمكنك استخدام النموذج القصير للأمر: /sn.
/remapPluginTypeNames اختياري. عند تحديد ذلك، تعيد الأداة تعيين أسماء الأنواع المؤهلة بالكامل للمكونات الإضافية استنادًا إلى التجميعات المضمنة في الحل. مفعل بشكل افتراضي في تنسيق التحكم في مصدر YAML. يمكنك استخدام النموذج القصير للأمر: /fp.

تنسيقات ملفات التحكم بالمصادر

يدعم SolutionPackager تخطيطين للمجلد عند استخراج حلول التعبئة.

تنسيق XML (قديم)

التنسيق الأصلي. تخزن الأداة بيانات تعريف الحل في Other\Solution.xml و Other\Customizations.xml. تستخرج الأداة جميع ملفات المكونات إلى بنية مجلدات مسطحة إلى جانب تلك الملفات. هذا التنسيق هو التنسيق الافتراضي عند استخراج .zip ملف دون مزيد من التكوين.

تنسيق YAML للتحكم في المصدر

يقدم هذا التنسيق جنبا إلى جنب مع تكامل Dataverse Git، ويخزن بيانات تعريف الحل كملفات YAML موزعة عبر التسلسل الهرمي للمجلدات المنظمة. إنه التنسيق المكتوب عند إجراء commit للحلول باستخدام تكامل Git الأصلي في Power Apps.

مزايا مقارنة بتنسيق XML

  • ينتج فروقات أكثر نظافة وقابلية للقراءة لكل مكون في التحكم في المصدر.
  • يدعم حلولا متعددة في مجلد مستودع واحد.
  • ملفات تطبيقات اللوحة .msapp والتدفقات الحديثة مدعومة فقط بهذا التنسيق.
  • يتم تمكين إعادة تعيين اسم نوع المكون الإضافي بشكل افتراضي.

بنية المجلد المطلوبة

<rootFolder>/
├── solutions/
│   └── <SolutionUniqueName>/
│       ├── solution.yml              (solution metadata)
│       ├── solutioncomponents.yml    (paths to all component files)
│       ├── rootcomponents.yml        (root-level components)
│       └── missingdependencies.yml   (dependency info)
├── publishers/
│   └── <PublisherUniqueName>/
│       └── publisher.yml             (publisher definition)
├── entities/                         (entity components, if present)
├── workflows/                        (classic workflows, if present)
├── modernflows/                      (Power Automate cloud flows, if present)
├── canvasapps/                       (canvas app .msapp files, if present)
└── [other component folders]/

Important

يشير وجود solutions/ مجلد فرعي يحتوي على *solution.yml ملفات إلى تنسيق YAML. إذا وضعت ملفات بيان YAML (solution.yml وsolutioncomponents.yml وما إلى ذلك) في جذر المجلد بدلاً من وضعها تحت solutions/<SolutionUniqueName>/، فلن تكتشف الأداة تنسيق YAML. تعود الأداة إلى مسار XML وتبلغ عن خطأ مضلل حول مفقود Customizations.xml. راجع استكشاف الأخطاء وإصلاحها للحصول على معلومات حول كيفية إصلاح هذه المشكلة.

مزيد من المعلومات: مرجع تنسيق التحكم في مصدر YAML للحل

تنسيق قواعد الكشف التلقائي

الشرط التنسيق المستخدم
solutions/*/solution.yml وجد — حل واحد بالضبط تنسيق YAML، حيث يتم استنتاج اسم الحل من المجلد
solutions/*/solution.yml تم العثور على — حلول متعددة تنسيق YAML، حيث تكون الوسيطة المطلوبة هي /SolutionName
لا يوجد solutions/ دليل فرعي تنسيق XML (قديم)

تجهيز مجلد بتنسيق YAML

يقوم الأمر التالي بحزم مجلد تنسيق YAML.

SolutionPackager.exe /action:Pack /zipfile:MySolution.zip /folder:C:\repos\myrepo

التعبئة من مجلد يحتوي على حلول متعددة

يقوم الأمر التالي بحزم حل محدد في مجلد متعدد الحلول.

SolutionPackager.exe /action:Pack /zipfile:SolutionA.zip /folder:C:\repos\myrepo /SolutionName:SolutionA

استخدم وسيطة الأمر /map

تفصل المناقشة التالية استخدام الوسيطة /map في الأداة SolutionPackager.

عادة ما لا يتم إدراج الملفات المضمنة في نظام بناء تلقائي، مثل .xap ملفات Silverlight وتجمعيات المكونات الإضافية، في نظام التحكم بالمصادر. قد يكون لديك بالفعل موارد ويب في التحكم بالمصادر في مواقع غير متوافقة مباشرة مع أداة SolutionPackager. من خلال تضمين المعلمة /map، يمكنك توجيه أداة SolutionPackager لقراءة هذه الملفات وحزمها من مواقع بديلة بدلا من داخل مجلد Extract. يجب أن تحدد معلمة /map الاسم والمسار إلى ملف XML الذي يحتوي على توجيهات التعيين. وترشد هذه التوجيهات SolutionPackager لمطابقة الملفات حسب اسمها ومسارها، وتشير إلى الموقع البديل للعثور على الملف المطابق. تنطبق المعلومات التالية على جميع التوجيهات بالتساوي.

  • يمكنك سرد توجيهات متعددة، بما في ذلك التوجيهات التي تطابق ملفات متطابقة مع بعضها. التوجيهات المدرجة سابقًا في الملف ستكون لها الأسبقية على تلك المدرجة لاحقًا.

  • إذا تمت مطابقة الملف مع أي توجيه، فيجب العثور عليه في موقع بديل واحد على الأقل. إذا لم يتم العثور على بدائل مطابقه، فسيصدر SolutionPackager رسالة خطأ.

  • يمكن أن تكون مسارات المجلدات والملفات مطلقة أو نسبية. يتم تقييم المسارات النسبية دائما من المجلد المحدد بواسطة المعلمة /folder.

  • حدد متغيرات البيئة باستخدام صيغة %variable%.

  • استخدم حرف البدل للمجلد ** للدلالة على "في أي مجلد فرعي". يمكنك استخدامه فقط كجزء أخير من المسار، على سبيل المثال: c:\folderA\**.

  • استخدم أحرف البدل لاسم الملف فقط في النماذج *.ext أو *.*. لا يوجد نمط آخر مدعوم.

    يصف القسم التالي الأنواع الثلاثة من تعيينات التوجيه، جنبا إلى جنب مع مثال يوضح لك كيفية استخدامها.

رسم خرائط المجلدات

يوفر القسم التالي معلومات مفصلة حول تعيين المجلد.

تنسيق XML

<Folder map="folderA" to="folderB" />

الوصف

تتحول مسارات الملفات التي تطابق "folderA" إلى "folderB".

  • يجب أن يتطابق التسلسل الهرمي للمجلدات الفرعية ضمن كل مجلد تماما.

  • أحرف بدل المجلد غير مدعومة.

  • لا يمكنك تحديد أسماء الملفات.

    الأمثلة

    <Folder map="folderA" to="folderB" />  
    <Folder map="folderA\folderB" to="..\..\folderC\" />  
    <Folder map="WebResources\subFolder" to="%base%\WebResources" />  
    

تعيين ملف إلى ملف

توفر المعلومات التالية المزيد من التفاصيل حول التعيين من ملف إلى ملف.

تنسيق XML

<FileToFile map="path\filename.ext" to="path\filename.ext" />

الوصف

يقرأ أي ملف يطابق المعلمة map من الاسم والمسار المحددين في المعلمة to.

فيما يتعلق بالمعلمة map:

  • حدد اسم ملف. المسار اختياري. إذا لم تحدد مسارا، يمكن أن يتطابق التعيين مع الملفات من أي مجلد.

  • أحرف بدل اسم الملف غير مدعومة.

  • يدعم محرف بدل المجلد.

    فيما يتعلق بالمعلمة to:

  • حدد اسم الملف ومساره.

  • يمكن أن يختلف اسم الملف عن الاسم في المعلمة map .

  • أحرف بدل اسم الملف غير مدعومة.

  • يدعم حرف بدل المجلد.

الأمثلة

  <FileToFile map="assembly.dll" to="c:\path\folder\assembly.dll" />  
  <FileToFile map="PluginAssemblies\**\this.dll" to="..\..\Plugins\**\that.dll" />  
  <FileToFile map="Webresrouces\ardvark.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\aardvark.jpg" />  
  <FileToFile
    map="pluginpackages\cr886_PluginPackageTest\package\cr886_PluginPackageTest.nupkg"
    to="myplg\bin\Debug\myplg.1.0.0.nupkg" /> 

في مثال حزمة NuGet السابق، cr886_PluginPackageTest.nupkg لا تتم الكتابة فوقه إذا كان الملف موجودا بالفعل في الموقع المحدد.

تعيين ملف إلى مسار

يوفر القسم التالي معلومات مفصلة حول تعيين ملف إلى مسار.

تنسيق XML

<FileToPath map="path\filename.ext" to="path" />

الوصف

map تحدد المعلمة الملف المراد مطابقته، وتحدد المعلمة to المسار للقراءة منه.

فيما يتعلق بالمعلمة map:

  • حدد اسم ملف. المسار اختياري. إذا لم تحدد مسارا، يمكن أن يتطابق التعيين مع الملفات من أي مجلد.

  • يدعم أحرف البدل لاسم الملف.

  • يدعم حرف بدل المجلد.

فيما يتعلق بالمعلمة to:

  • حدد مسارًا.

  • يدعم حرف بدل المجلد.

  • لا تحدد اسم ملف.

    الأمثلة

  <FileToPath map="assembly.dll" to="c:\path\folder" />  
  <FileToPath map="PluginAssemblies\**\this.dll" to="..\..\Plugins\bin\**" />  
  <FileToPath map="*.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\" />  
  <FileToPath map="*.*" to="..\..\%ARCH%\%TYPE%\drop" />  

مثال على التعيين

يعرض نموذج التعليمات البرمجية XML التالي ملف تعيين كامل يمكن أداة SolutionPackager من قراءة أي مورد ويب والتجميعين الافتراضيين اللذين تم إنشاؤهما من مشروع Developer Toolkit المسمى CRMDevTookitSample.

<?xml version="1.0" encoding="utf-8"?>  
<Mapping>  
       <!-- Match specific named files to an alternate folder -->  
       <FileToFile map="CRMDevTookitSamplePlugins.dll" to="..\..\Plugins\bin\**\CRMDevTookitSample.plugins.dll" />  
       <FileToFile map="CRMDevTookitSampleWorkflow.dll" to="..\..\Workflow\bin\**\CRMDevTookitSample.Workflow.dll" />  
       <!-- Match any file in and under WebResources to an alternate set of subfolders -->  
       <FileToPath map="WebResources\*.*" to="..\..\CrmPackage\WebResources\**" />  
       <FileToPath map="WebResources\**\*.*" to="..\..\CrmPackage\WebResources\**" />  
</Mapping>  

الحلول المُدَارة أو غير المُدَارة

يمكنك تصدير ملف حل مضغوط Dataverse (.zip) كحل مدار أو غير مدار.

الحل المُدار
حل مكتمل جاهز للاستيراد إلى مؤسسة. بمجرد الاستيراد، لا يمكنك إضافة مكونات أو إزالتها، على الرغم من أنه يمكنك اختياريًا السماح بمزيد من التخصيص. استخدم هذا النوع عند اكتمال تطوير الحل.

الحل غير المُدار
حل مفتوح بدون قيود على ما يمكنك إضافته أو إزالته أو تعديله. استخدم هذا النوع أثناء تطوير حل.

يختلف تنسيق ملف الحل المضغوط بناءً على نوعه، إما مُدار أو غير مُدار. يمكن ل SolutionPackager معالجة ملفات الحلول المضغوطة من أي نوع. ومع ذلك، لا يمكن للأداة تحويل نوع إلى آخر. الطريقة الوحيدة لتحويل ملفات الحل إلى نوع مختلف، مثل من غير مدار إلى مدار، هي عن طريق استيراد الحل غير المدار .zip الملف إلى خادم Dataverse ثم تصدير الحل كحل مدار.

يمكن لـ SolutionPackager معالجة ملفات ‎.zip‎ للحلول غير المُدارة والمُدارة كمجموعة مجمعة باستخدام المعلمة /PackageType:Both. لتنفيذ هذه العملية، تحتاج إلى تصدير الحل مرة واحدة لكل نوع. قم بتسمية ملفات .zip كما يلي:

ملف zip. غير مُدار: AnyName.zip

ملف zip. مُدار: AnyName_managed.zip

تفترض الأداة أن ملف zip المُدار موجود في المجلد نفسه الذي يوجد فيه الملف غير المُدار. يستخرج كلا الملفين في مجلد واحد مع الحفاظ على التمييز بينهما حيث توجد مكونات مُدارة وغير مُدارة.

بعد أن تستخرج حلاً بنسختيه غير المُدارة والمُدارة، يمكنك تحزيم كلا النوعين أو تحزيم كل نوع على حدة من ذلك المجلد نفسه. استخدم المعلمة /PackageType لتحديد النوع الذي يجب إنشاؤه. عند تحديد كلا الملفين، تنتج الأداة ملفين .zip باستخدام اصطلاح التسمية السابق. إذا لم تُضمِّن المعلمة /PackageType عند إجراء التعبئة من مجلد ثنائي يضم محتوى مُدارًا وغير مُدار، فسيكون السلوك الافتراضي هو إنشاء ملف ‎.zip‎ واحد غير مُدار.

استكشاف الأخطاء وإصلاحها

الرسالة المعروضة عند استخدام Visual Studio لتحرير ملفات الموارد

إذا كنت تستخدم Visual Studio لتحرير ملفات الموارد التي تم إنشاؤها بواسطة حزمة الحلول، فقد ترى رسالة عند إعادة حزمها بشكل مشابه لهذا: "Failed to determine version id of the resource file <filename>.resx the resource file must be exported from the solutionpackager.exe tool in order to be used as part of the pack process." تظهر هذه الرسالة لأن Visual Studio يستبدل علامات بيانات التعريف لملف المورد بعلامات البيانات.

حل بديل

  1. افتح ملف المورد في محرر النص المفضل لديك ثم حدد موقع العلامات التالية وقم بتحديثها:

    <data name="Source LCID" xml:space="preserve">  
    <data name="Source file" xml:space="preserve">  
    <data name="Source package type" xml:space="preserve">  
    <data name="SolutionPackager Version" mimetype="application/x-microsoft.net.object.binary.base64">  
    
    
  2. قم بتغيير اسم العقدة من <data> إلى <metadata>.

    على سبيل المثال ، هذه السلسلة:

    <data name="Source LCID" xml:space="preserve">  
      <value>1033</value>  
    </data>  
    
    

    تتغير إلى:

    <metadata name="Source LCID" xml:space="preserve">  
      <value>1033</value>  
    </metadata>  
    
    

    يسمح هذا التغيير لأداة حزم الحلول بقراءة ملف الموارد واستيراده. يحدث هذا الخطأ فقط عند استخدام محرر الموارد في Visual Studio.

خطأ: "يتعذر العثور على الملف المطلوب ...\Other\Customizations.xml" مع مجلد YAML

يظهر هذا الخطأ عند تشغيل SolutionPackager (أو pac solution pack) على مجلد يحتوي على ملفات YAML مثل solution.yml، ولكنك تضع هذه الملفات في جذر المجلد بدلًا من وضعها داخل المجلد الفرعي المطلوب solutions/<SolutionUniqueName>/.

يسبب: تكتشف الأداة تنسيق التحكم في مصدر YAML من خلال البحث solutions/ عن مجلد فرعي يحتوي على *solution.yml ملفات. عندما يكون هذا الدليل غائبا، تعود الأداة بصمت إلى تنسيق XML (القديم) وتتوقع Other\Customizations.xml. تشير رسالة الخطأ إلى ملف XML ولا تذكر YAML، مما قد يكون مربكا.

اصلاح: أعد تنظيم المجلد بحيث تكون ملفات بيان YAML ضمن المسارات الصحيحة:

<rootFolder>/
  solutions/<YourSolutionUniqueName>/   ← move solution.yml here
    solution.yml
    solutioncomponents.yml
    rootcomponents.yml
    missingdependencies.yml
  publishers/<YourPublisherUniqueName>/
    publisher.yml

إذا حصلت على المجلد من خلال عملية إرسال في تكامل Git أو pac solution clone، فبنية المجلد صحيحة بالفعل. يمثل المجلد الذي يحتوي فقط على ملفات YAML ذات المستوى الأعلى بدون solutions/ الدليل الفرعي استخراجا غير مكتمل ولا يمكن حزمه مباشرة.

تحذير: المكون المعلن عنه في rootcomponents.yml لا يحتوي على ملفات مصدر

يظهر هذا التحذير عند إدراج مكون، مثل تطبيق اللوحة، في rootcomponents.yml ولكن لا توجد ملفات مصدر مقابلة في مجلد المكون المتوقع (على سبيل المثال، canvasapps/<schema-name>/).

تاثير: لا تزال الأداة تنجح (رمز الخروج 0) وتنتج ملفا صالحا .zip ، ولكن يتم حذف المكون المعلن من الحل المجمع.

يسبب: تم إنتاج المجلد بواسطة استخراج جزئي، أو لم يتم تضمين ملفات مصدر المكون في المستودع. على سبيل المثال، تم تثبيت ملفات بيان الحل فقط وليس تطبيق اللوحة نفسه.

اصلاح: تأكد من أن جميع المكونات المعلن عنها في rootcomponents.yml تحتوي على ملفات مصدر مقابلة موجودة في المجلد. بالنسبة لتطبيقات اللوحة، .msapp يجب أن يكون الملف موجودا ضمن canvasapps/<schema-name>/. إذا كانت هناك أي ملفات مفقودة، أعد تصدير الحل الكامل من Dataverse وقم بفك حزمته مرة أخرى، أو استخدم pac solution clone للحصول على استخراج كامل.

راجع أيضًا