Lưu ý
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử đăng nhập hoặc thay đổi thư mục.
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử thay đổi thư mục.
SolutionPackager là một công cụ có thể phân tách đảo ngược tệp giải pháp nén Microsoft Dataverse thành nhiều tệp XML và các tệp khác. Sau đó, bạn có thể dễ dàng quản lý các tệp này bằng cách sử dụng hệ thống kiểm soát nguồn. Các phần sau đây cho bạn thấy cách chạy công cụ và cách sử dụng công cụ với các giải pháp được quản lý và không được quản lý.
Quan trọng
Công cụ SolutionPackager không còn là cách được khuyến nghị để giải nén và đóng gói các giải pháp. Các khả năng của công cụ SolutionPackager được tích hợp vào Power Platform CLI. Lệnh này pac solution có nhiều động từ bao gồm unpack, pack, clonevà sync kết hợp các khả năng cơ bản tương tự của công cụ SolutionPackager.
Vị trí của công cụ SolutionPackager
Công cụ SolutionPackager được phân phối như một phần của Microsoft. CrmSdk.CoreTools gói NuGet. Để cài đặt chương trình, hãy làm theo các bước sau.
- Tải xuống gói NuGet .
- Đổi tên phần mở rộng tên tệp của gói từ .nupkg thành .zip.
- Giải nén nội dung của tệp nén (zip).
Tìm tệp thực thi SolutionPackager.exe trong thư mục <extracted-folder-name>/contents/bin/coretools. Chạy chương trình từ thư mục coretools hoặc thêm thư mục đó vào PATH của bạn.
Đối số dòng lệnh SolutionPackager
SolutionPackager là một công cụ dòng lệnh có thể được gọi với các tham số được xác định trong bảng sau.
| Đối số | Description |
|---|---|
| /action: {Trích xuất|Đóng gói} | Yêu cầu. Hành động thực hiện. Hành động có thể là trích xuất một tệp giải pháp .zip vào một thư mục hoặc để đóng gói một thư mục vào một tệp .zip. |
| /zipfile: <đường dẫn tệp> | Yêu cầu. Đường dẫn và tên của một tệp .zip giải pháp. Khi giải nén, tập tin phải tồn tại và có thể đọc được. Khi đóng gói, tệp được thay thế. |
| /folder: <đường dẫn thư mục> | Yêu cầu. Đường dẫn đến một thư mục. Khi giải nén, thư mục này được tạo và điền vào các tệp thành phần. Khi đóng gói, thư mục này phải tồn tại và chứa các tệp thành phần được trích xuất trước đó. |
| /packagetype: {Không được quản lý|Được quản lý|Cả hai} | Tùy chọn. Loại gói để xử lý. Giá trị mặc định là Không được quản lý. Đối số này có thể được bỏ qua trong hầu hết các trường hợp vì loại gói có thể được đọc từ bên trong tệp .zip hoặc tệp thành phần. Khi giải nén và giá trị Cả hai được chỉ định, các tệp .zip được quản lý và không được quản lý phải có mặt và được xử lý vào một thư mục. Khi đóng gói và Cả hai được chỉ định, các tệp .zip giải pháp được quản lý và không được quản lý sẽ được tạo từ một thư mục. Để biết thêm thông tin, hãy xem phần về làm việc với các giải pháp được quản lý và không được quản lý ở phần sau của bài viết này. |
| /allowWrite:{Yes|No} | Tùy chọn. Giá trị mặc định là Có. Đối số này chỉ được sử dụng trong quá trình trích xuất. Khi /allowWrite:No được chỉ định, công cụ sẽ thực hiện tất cả các hoạt động nhưng bị ngăn không cho ghi hoặc xóa bất kỳ tệp nào. Hoạt động giải nén có thể được đánh giá một cách an toàn mà không cần ghi đè hoặc xóa bất kỳ tệp hiện có. |
| /allowDelete:{Yes|No|Prompt} | Tùy chọn. Giá trị mặc định là Prompt (Nhắc). Đối số này chỉ được sử dụng trong quá trình trích xuất. Khi /allowDelete:Yes được chỉ định, bất kỳ tệp nào có trong thư mục được chỉ định bởi tham số /folder mà không mong muốn sẽ tự động bị xóa. Khi /allowDelete:No được chỉ định, sẽ không có thao tác xóa nào xảy ra. Khi /allowDelete:Prompt được chỉ định, người dùng được nhắc thông qua bảng điều khiển để cho phép hoặc từ chối tất cả các thao tác xóa. Nếu /allowWrite:No được chỉ định, sẽ không có lệnh xóa nào xảy ra ngay cả khi /allowDelete:Yes cũng được chỉ định. |
| /clobber | Tùy chọn. Đối số này chỉ được sử dụng trong quá trình trích xuất. Khi /clobber được chỉ định, các tệp có bộ thuộc tính chỉ đọc sẽ bị ghi đè hoặc bị xóa. Khi không được chỉ định, các tệp có thuộc tính chỉ đọc sẽ không bị ghi đè hoặc xóa. |
| /errorlevel: {tắt |Lỗi |Cảnh báo|Thông tin |Verbose} | Tùy chọn. Giá trị mặc định là Info (Thông tin). Đối số này cho biết mức độ ghi thông tin vào đầu ra. |
| /map: <đường dẫn tệp> | Tùy chọn. Đường dẫn và tên của tệp .xml chứa các chỉ thị ánh xạ tệp. Khi được sử dụng trong quá trình trích xuất, các tệp thường được đọc từ bên trong thư mục được chỉ định bởi tham số /folder được đọc từ các vị trí thay thế như được chỉ định trong tệp ánh xạ. Trong thao tác gói, các tệp khớp với các chỉ thị sẽ không được ghi. |
| /nologo | Tùy chọn. Bỏ qua biểu ngữ trong thời gian chạy. |
| /log: <đường dẫn tệp> | Tùy chọn. Một đường dẫn và tên đến một tệp nhật ký. Nếu tệp đã tồn tại, thông tin đăng nhập mới sẽ được thêm vào tệp. |
| @ <đường dẫn tệp> | Tùy chọn. Đường dẫn và tên của tệp chứa đối số dòng lệnh cho công cụ. |
| /sourceLoc: <chuỗi> | Tùy chọn. Đối số này tạo tệp tài nguyên mẫu và chỉ hợp lệ trên trích xuất. Giá trị có thể là auto hoặc mã LCID/ISO cho ngôn ngữ bạn muốn xuất. Khi đối số này được sử dụng, tài nguyên chuỗi từ ngôn ngữ đã cho được trích xuất dưới dạng tệp .resx trung tính. Nếu auto hoặc chỉ hình thức dài hoặc ngắn của thao tác chuyển được chỉ định, ngôn ngữ cơ sở hoặc giải pháp được sử dụng. Bạn có thể sử dụng dạng rút gọn của lệnh: /src. |
| /localize | Tùy chọn. Trích xuất hoặc trộn tất cả các tài nguyên chuỗi vào các tệp .resx. Bạn có thể sử dụng dạng rút gọn của lệnh: /loc. Tùy chọn bản địa hóa hỗ trợ các thành phần được chia sẻ cho các tệp .resx. Thông tin thêm: Sử dụng tài nguyên web RESX |
| /SolutionName: <tên> | Tùy chọn. Tên duy nhất của giải pháp để đóng gói hoặc giải nén khi thư mục nguồn chứa nhiều giải pháp trong .solutions/*/solution.yml Bắt buộc khi phát hiện nhiều dung dịch. Chỉ áp dụng cho định dạng kiểm soát nguồn YAML. Bạn có thể sử dụng dạng viết tắt của lệnh: /sn. |
| /remapPluginTypeNames | Tùy chọn. Khi được chỉ định, tên loại đủ điều kiện của plug-in được ánh xạ lại dựa trên các cụm có trong giải pháp. Được bật theo mặc định ở định dạng kiểm soát nguồn YAML. Bạn có thể sử dụng dạng viết tắt của lệnh: /fp. |
Định dạng tệp kiểm soát nguồn
SolutionPackager hỗ trợ hai bố cục thư mục khi giải nén và đóng gói các giải pháp.
Định dạng XML (kế thừa)
Định dạng gốc. Siêu dữ liệu giải pháp được lưu trữ trong Other\Solution.xml và Other\Customizations.xmlvà tất cả các tệp thành phần được giải nén vào hệ thống phân cấp thư mục phẳng cùng với các tệp đó. Định dạng này là định dạng mặc định khi giải nén .zip tệp mà không cần cấu hình thêm.
Định dạng kiểm soát nguồn YAML
Được giới thiệu cùng với tích hợp Dataverse Git, định dạng này lưu trữ siêu dữ liệu giải pháp dưới dạng tệp YAML được phân phối trên hệ thống phân cấp thư mục có cấu trúc. Đó là định dạng được viết khi bạn cam kết các giải pháp bằng cách sử dụng tích hợp Git gốc trong Power Apps.
Ưu điểm so với định dạng XML
- Tạo ra sự khác biệt rõ ràng, dễ đọc hơn cho mỗi thành phần trong điều khiển nguồn
- Hỗ trợ nhiều giải pháp trong một thư mục kho lưu trữ duy nhất
- Tệp ứng dụng
.msappcanvas và dòng hiện đại chỉ được hỗ trợ ở định dạng này - Ánh xạ lại tên loại trình cắm được bật theo mặc định
Cấu trúc thư mục bắt buộc
<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]/
Quan trọng
Định dạng YAML được tự động phát hiện bằng sự hiện diện của một solutions/ thư mục con chứa *solution.yml các tệp.
Nếu các tệp kê khai YAML của bạn (solution.yml, solutioncomponents.yml, v.v.) được đặt ở thư mục gốc chứ không phải dưới solutions/<SolutionUniqueName>/, công cụ sẽ không phát hiện định dạng YAML. Công cụ quay trở lại đường dẫn XML và báo cáo lỗi gây hiểu lầm về việc thiếu Customizations.xmltệp . Xem Khắc phục sự cố để biết thông tin về cách khắc phục sự cố này.
Thông tin thêm: Tham chiếu định dạng kiểm soát nguồn YAML của giải pháp
Định dạng quy tắc tự động phát hiện
| Điều kiện | Định dạng được sử dụng |
|---|---|
solutions/*/solution.yml Tìm thấy — chính xác một giải pháp |
Định dạng YAML, trong đó tên giải pháp được suy ra từ thư mục |
solutions/*/solution.yml Tìm thấy — Nhiều giải pháp |
YAML, trong đó /SolutionName đối số là bắt buộc |
Không solutions/ có thư mục con |
Định dạng XML (kế thừa) |
Đóng gói thư mục định dạng YAML
Lệnh sau đây đóng gói thư mục định dạng YAML.
SolutionPackager.exe /action:Pack /zipfile:MySolution.zip /folder:C:\repos\myrepo
Đóng gói từ thư mục đa dung dịch
Lệnh sau đây đóng gói một giải pháp được chỉ định trong thư mục nhiều giải pháp.
SolutionPackager.exe /action:Pack /zipfile:SolutionA.zip /folder:C:\repos\myrepo /SolutionName:SolutionA
Sử dụng đối số lệnh /map
Cuộc thảo luận sau đây mô tả chi tiết việc sử dụng đối số /map cho công cụ SolutionPackager.
Các tệp được xây dựng trong một hệ thống xây dựng tự động, chẳng hạn như các tệp .xap Silverlight và các tập hợp phần bổ trợ, thường không được kiểm tra trong kiểm soát nguồn. Tài nguyên web có thể đã có sẵn trong kiểm soát nguồn ở những vị trí không tương thích trực tiếp với công cụ SolutionPackager. Bằng cách bao gồm tham số /map, công cụ SolutionPackager có thể được hướng dẫn để đọc và đóng gói các tệp đó từ các vị trí thay thế chứ không phải từ bên trong thư mục Extract như thường được thực hiện. Tham số /map phải chỉ định tên và đường dẫn đến tệp XML chứa chỉ thị ánh xạ. Các lệnh đó hướng dẫn SolutionPackager khớp các tệp theo tên và đường dẫn của chúng, đồng thời chỉ ra vị trí thay thế để tìm tệp khớp. Các thông tin sau đây áp dụng như nhau cho tất cả các chỉ thị.
Có thể liệt kê nhiều chỉ thị bao gồm cả những chỉ thị khớp với các tệp giống hệt nhau. Các chỉ thị được liệt kê ở đầu tệp sẽ có quyền ưu tiên hơn các chỉ thị được liệt kê ở sau.
Nếu một tệp được khớp với bất kỳ chỉ thị nào, nó phải được tìm thấy ở ít nhất một vị trí thay thế. Nếu không tìm thấy giải pháp thay thế phù hợp, SolutionPackager sẽ đưa ra lỗi.
Đường dẫn thư mục và tệp có thể là tuyệt đối hoặc tương đối. Đường dẫn tương đối luôn được đánh giá từ thư mục được chỉ định bởi tham số /folder.
Biến môi trường có thể được chỉ định bằng cách sử dụng cú pháp %variable%.
Ký tự đại diện thư mục "**" có thể được sử dụng để có nghĩa là "trong bất kỳ thư mục con nào". Nó chỉ có thể được sử dụng làm phần cuối cùng của đường dẫn, ví dụ: "c:\folderA\**".
Tên tệp ký tự đại diện chỉ có thể được sử dụng ở dạng "*.ext" hoặc "*.*". Không hỗ trợ mẫu khác.
Ba loại ánh xạ chỉ thị được mô tả ở đây, cùng với một ví dụ chỉ cho bạn cách sử dụng.
Ánh xạ thư mục
Thông tin sau đây cung cấp thông tin chi tiết về cách ánh xạ thư mục.
Định dạng XML
<Folder map="folderA" to="folderB" />
Mô tả
Đường dẫn tệp khớp với "folderA" được chuyển thành "folderB".
Hệ thống phân cấp của các thư mục con dưới mỗi thư mục phải khớp chính xác.
Ký tự đại diện thư mục không được hỗ trợ.
Không thể chỉ định tên tệp.
Ví dụ
<Folder map="folderA" to="folderB" /> <Folder map="folderA\folderB" to="..\..\folderC\" /> <Folder map="WebResources\subFolder" to="%base%\WebResources" />
Ánh xạ tệp đến tệp
Thông tin sau đây cung cấp thêm chi tiết về ánh xạ tệp sang tệp.
Định dạng XML
<FileToFile map="path\filename.ext" to="path\filename.ext" />
Mô tả
Bất kỳ tệp nào khớp với tham số map đều được đọc từ tên và đường dẫn được chỉ định trong tham số to .
Đối với tham số map:
Phải chỉ định một tên tệp. Đường dẫn là tùy chọn. Nếu không có đường dẫn nào được chỉ định, các tệp từ bất kỳ thư mục nào đều có thể được khớp.
Không hỗ trợ ký tự đại diện cho tên tệp.
Ký tự đại diện thư mục được hỗ trợ.
Đối với tham số
to:Phải chỉ định một tên tệp và đường dẫn.
Tên tệp có thể khác với tên trong tham số
map.Không hỗ trợ ký tự đại diện cho tên tệp.
Ký tự đại diện thư mục được hỗ trợ.
Ví dụ
<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" />
Trong ví dụ về gói ở trên, cr886_PluginPackageTest.nupkg không bị ghi đè nếu tệp đã tồn tại ở vị trí đã chỉ định. NuGet
Ánh xạ tệp đến đường dẫn
Phần sau đây cung cấp thông tin chi tiết về ánh xạ tệp đến đường dẫn.
Định dạng XML
<FileToPath map="path\filename.ext" to="path" />
Mô tả
Bất kỳ tệp nào phù hợp với tham số map được đọc từ tên và đường dẫn được chỉ định trong tham số to.
Đối với tham số map:
Phải chỉ định một tên tệp. Đường dẫn là tùy chọn. Nếu không có đường dẫn nào được chỉ định, các tệp từ bất kỳ thư mục nào đều có thể được khớp.
Ký tự đại diện tên tệp được hỗ trợ.
Ký tự đại diện thư mục được hỗ trợ.
Đối với tham số to:
Phải chỉ định một đường dẫn.
Ký tự đại diện thư mục được hỗ trợ.
Không được chỉ định tên tệp.
Ví dụ
<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" />
Ánh xạ ví dụ
Mẫu mã XML sau đây cho thấy một tệp ánh xạ hoàn chỉnh cho phép công cụ SolutionPackager đọc bất kỳ tài nguyên web nào và hai tập hợp được tạo mặc định từ dự án Bộ công cụ dành cho nhà phát triển có tên 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>
Giải pháp được quản lý và không được quản lý
Một tệp giải pháp nén (.zip) của Dataverse có thể được xuất thành một trong hai loại như được hiển thị ở đây.
Giải pháp được quản lý
Một giải pháp hoàn thành đã sẵn sàng để được nhập vào một tổ chức. Sau khi nhập, các thành phần không thể được thêm hoặc xóa, mặc dù chúng có thể tùy chọn cho phép tùy chỉnh thêm. Điều này được khuyến nghị khi phát triển giải pháp hoàn tất.
Giải pháp không được quản lý
Một giải pháp mở không có giới hạn về những gì có thể được thêm, xóa hoặc sửa đổi. Điều này được khuyến nghị trong quá trình phát triển một giải pháp.
Định dạng của tệp giải pháp nén sẽ khác nhau dựa trên loại của nó, được quản lý hoặc không được quản lý. SolutionPackager có thể xử lý các tệp giải pháp nén thuộc một trong hai loại. Tuy nhiên, công cụ này không thể chuyển đổi loại này sang loại khác. Cách duy nhất để chuyển đổi các tệp giải pháp sang một loại khác, ví dụ từ không được quản lý sang được quản lý, là bằng cách nhập tệp .zip giải pháp không được quản lý vào một máy chủ Dataverse rồi xuất giải pháp dưới dạng giải pháp được quản lý.
SolutionPackager có thể xử lý các tệp .zip không được quản lý và giải pháp được quản lý dưới dạng tập hợp kết hợp thông qua tham số /PackageType:Both. Để thực hiện thao tác này, cần phải xuất giải pháp của bạn hai lần theo từng loại, đặt tên tệp .zip như sau.
Tệp .zip không được quản lý: AnyName.zip
Tệp .zip không được quản lý: AnyName_managed.zip
Công cụ sẽ giả sử sự hiện diện của tệp zip được quản lý trong cùng một thư mục với tệp không được quản lý và trích xuất cả hai tệp vào một thư mục duy trì sự khác biệt nơi tồn tại các thành phần được quản lý và không được quản lý.
Sau khi giải pháp được trích xuất là cả không được quản lý và được quản lý, có thể từ thư mục đơn đó để đóng gói cả hai hoặc từng loại riêng lẻ, sử dụng tham số /PackageType để chỉ định loại sẽ tạo. Khi chỉ định cả hai tệp, hai tệp .zip sẽ được tạo ra bằng cách sử dụng quy ước đặt tên như trên. Nếu tham số /PackageType bị thiếu khi đóng gói từ thư mục được quản lý kép và không được quản lý, mặc định là tạo một tệp .zip không được quản lý.
Gỡ rối
Thông báo hiển thị khi sử dụng Visual Studio để chỉnh sửa tệp tài nguyên
Nếu bạn sử dụng Visual Studio để chỉnh sửa các tài nguyên do trình đóng gói giải pháp tạo, bạn có thể nhận được thông báo khi đóng gói lại tương tự như sau: "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." Điều này xảy ra do Visual Studio thay thế thẻ siêu dữ liệu của tệp tài nguyên bằng thẻ dữ liệu.
Giải pháp thay thế
Mở tệp tài nguyên trong trình soạn thảo văn bản yêu thích của bạn rồi xác định và cập nhật các thẻ sau:
<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">Thay đổi tên nút từ
<data>thành<metadata>.Ví dụ: chuỗi này:
<data name="Source LCID" xml:space="preserve"> <value>1033</value> </data>Thay đổi thành:
<metadata name="Source LCID" xml:space="preserve"> <value>1033</value> </metadata>Điều này cho phép trình đóng gói giải pháp đọc và nhập tệp tài nguyên. Vấn đề này chỉ được quan sát thấy khi sử dụng trình soạn thảo Visual Studio Resource.
Lỗi: "Không thể tìm thấy tệp cần thiết ...\Other\Customizations.xml" với thư mục YAML
Lỗi này xuất hiện khi bạn chạy SolutionPackager (hoặc pac solution pack) đối với một thư mục chứa các tệp YAML, chẳng hạn như solution.yml, nhưng các tệp đó được đặt ở thư mục gốc của thư mục thay vì bên trong thư mục con bắt buộc solutions/<SolutionUniqueName>/ .
Nguyên nhân: Công cụ phát hiện định dạng kiểm soát nguồn YAML bằng cách tìm thư solutions/ mục con chứa *solution.yml tệp. Khi thư mục đó vắng mặt, công cụ sẽ lặng lẽ quay trở lại định dạng XML (cũ) và mong đợi Other\Customizations.xml. Thông báo lỗi kết quả đề cập đến tệp XML và không đề cập đến YAML, điều này gây hiểu lầm.
Khắc phục: Sắp xếp lại thư mục để các tệp kê khai YAML nằm dưới các đường dẫn chính xác:
<rootFolder>/
solutions/<YourSolutionUniqueName>/ ← move solution.yml here
solution.yml
solutioncomponents.yml
rootcomponents.yml
missingdependencies.yml
publishers/<YourPublisherUniqueName>/
publisher.yml
Nếu bạn lấy thư mục từ cam kết tích hợp Git hoặc pac solution clone, cấu trúc thư mục đã đúng. Thư mục chỉ chứa các tệp YAML cấp cao nhất mà không có solutions/ thư mục con đại diện cho một trích xuất chưa hoàn chỉnh và không thể được đóng gói trực tiếp.
Cảnh báo: component được khai báo trong rootcomponents.yml không có tệp nguồn
Cảnh báo này xuất hiện khi một thành phần, chẳng hạn như ứng dụng canvas, được liệt kê trong rootcomponents.yml nhưng không có tệp nguồn tương ứng nào tồn tại trong thư mục thành phần dự kiến (ví dụ: canvasapps/<schema-name>/).
Hiệu ứng: Công cụ vẫn thành công (mã thoát 0) và tạo ra một tệp hợp lệ .zip , nhưng thành phần đã khai báo bị bỏ qua khỏi giải pháp đóng gói.
Nguyên nhân: Thư mục được tạo bằng cách trích xuất một phần hoặc các tệp nguồn của thành phần không được đưa vào kho lưu trữ. Ví dụ: chỉ các tệp kê khai giải pháp được cam kết chứ không phải bản thân ứng dụng canvas.
Khắc phục: Đảm bảo tất cả các thành phần được khai báo trong rootcomponents.yml có các tệp nguồn tương ứng có trong thư mục. Đối với ứng dụng canvas, tệp .msapp phải tồn tại trong canvasapps/<schema-name>/. Nếu thiếu bất kỳ tệp nào, hãy xuất lại giải pháp đầy đủ từ Dataverse và giải nén lại hoặc sử dụng pac solution clone để có được trích xuất hoàn chỉnh.