أداة SolutionPackager

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

مهم

لم تعد الأداة 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|Pack} مطلوب. الإجراء الذي يجب القيام به. يمكن أن يكون الإجراء إما لاستخراج حل .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|Error|Warning|Info|Verbose} اختياري. القيمة الافتراضية هي معلومات. تشير هذه الوسيطة إلى مستوى معلومات التسجيل إلى مخرجات.
/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 موزعة عبر التسلسل الهرمي للمجلدات المنظمة. إنه التنسيق المكتوب عند تثبيت الحلول باستخدام تكامل 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]/

مهم

يتم الكشف تلقائيا عن تنسيق YAML من خلال وجود solutions/ مجلد فرعي يحتوي على *solution.yml ملفات. إذا تم وضع ملفات بيان 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 لقراءة هذه الملفات وتعبئتها من مواقع بديلة وليس من داخل مجلد الاستخراج كما هو الحال عادة. يجب أن تحدد معلمة /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>  

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

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

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

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

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

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

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

ملف zip. مُدار: AnyName_managed.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 للحصول على استخراج كامل.

راجع أيضًا