PnP Office Open XML 文件格式 (.pnp)

如果你拥有包含文件引用的模板(通过 <pnp:Files /> 元素),则必须同时分发 xml 文件以及所引用的文件。 虽然这样做确实可行,但是将文件复制到另一个位置时很容易丢失文件。

注意

PnP 预配框架 & PnP 预配引擎是开放源代码解决方案,其活动社区为其提供支持。 没有用于 Microsoft 开放源代码工具支持的 SLA。

因此,我们引入了一种特定的 Office Open XML 格式,称为“pnp 文件”。 实际上,它是一个包含特定结构的 zip 文件。 如果将 .pnp 文件重命名为具有 .zip 扩展名,则只需打开该文件并进行查看即可。

PnP 文件的内容

文件

如果打开压缩文件夹中的 Files 文件夹,你会看到很多奇怪的文件名,这些文件名均基于 Guid(全局唯一标识符)

Files 文件夹的内容

模板本身位于此列表中,其扩展名为 .xml。 你看到的其他文件实际上就是在 XML 模板中引用的文件。

已将每个文件重命名为具有唯一的文件名。 导致此问题的原因是,Office Open XML 文件格式不允许在此结构中包含子文件夹,但如果模板中引用了 2 个不同的文件,每个文件都具有相同的文件名,该怎么办? 假设你有一个名为 project.docx 的文件进入了共享文档库,并且另一个 project.docx 文件进入了项目文档库,该怎么办? 因此,我们需要将文件重命名为具有唯一的文件名。

应用模板时,我们使用查阅表格来查找实际的文件名。 该查阅表格位于 ProvisioningTemplate 文件夹中,称为 files-map.xml

以下是该文件的内容示例:

<PnPFilesMap xmlns="clr-namespace:OfficeDevPnP.Core.Framework.Provisioning.Connectors.OpenXML.Model;assembly=OfficeDevPnP.Core" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <PnPFilesMap.Map>
    <x:String x:Key="19cd09af-97a4-4015-ab9e-22451180702a.xml">theperspective.xml</x:String>
    <x:String x:Key="cce8b9eb-73d2-4f72-8f42-2c6eb08e1566.png">assets/__sitelogo___sitelogo_theperspective.png</x:String>
    <x:String x:Key="e4d4df2d-dab9-48e6-ab9e-8791d8bd8a86.pdf">assets/documents/Contoso Falcon.pdf</x:String>
    <x:String x:Key="c364ce2a-05f0-4cfa-b916-9476004757ba.pdf">assets/documents/Contoso Flex.pdf</x:String>
    <x:String x:Key="d06ca829-8e74-42e6-92b7-426899e82243.pdf">assets/documents/Contoso Mark8 Controller.pdf</x:String>
    <x:String x:Key="670ef91a-18b1-4869-9ca2-fc573e6eca2f.pdf">assets/documents/Contoso Mark8.pdf</x:String>
    <x:String x:Key="b90f3fd6-933f-4c55-a267-298be21c9d32.pdf">assets/documents/Contoso Quad.pdf</x:String>
    <x:String x:Key="35667dfc-1a0c-4322-8980-43c58dd6ea70.png">assets/SitePages/2019-sales-leadership-award/sales-leadership-award.png</x:String>
    <x:String x:Key="5c886067-3fd3-48bc-974e-75e7fc3aece0.jpeg">assets/SitePages/Contoso-called-on-drone-pilots-to/AdobeStock_145027729.jpeg</x:String>
    <x:String x:Key="eeebf271-8661-4429-91f8-a3798b278900.jpg">assets/SitePages/Contoso-partners-with-non-profit-to-deliver-life-saving-supplies/7719-larm-rmah-216854-unsplash.jpg</x:String>
    <x:String x:Key="48596918-fcbc-4d48-a0a9-ed966a4d1d65.jpg">assets/SitePages/Miriam-Graham--Contoso-s-new-Chief-Marketing-Officer/CLO17_azure_004.jpg</x:String>
    <x:String x:Key="ceb43a63-37e5-4730-aad0-58fb5c3ea711.jpg">assets/SitePages/One-million-drones-sold-in-2018/kevin-chow-176761-unsplash.jpg</x:String>
    <x:String x:Key="936af989-985e-4f2a-9f16-39da9c2e8dea.jpg">assets/SitePages/One-million-drones-sold-in-2018/white-drone-hovering-in-a-bright-blue-sky-PFV2XG7.jpg</x:String>
    <x:String x:Key="e79b754e-c9f3-44a0-ae57-00119f326cf7.jpeg">assets/SitePages/Our-commitment-to-sustainability/AdobeStock_83900723.jpeg</x:String>
    <x:String x:Key="1fca3e50-1d69-4bd1-87db-d3363803b6c8.jpg">assets/SitePages/Patti-announces-flagship-store-opening/contoso-storefront.jpg</x:String>
    <x:String x:Key="63767808-1e11-40f8-956e-475d98e8a9f4.jpeg">assets/SitePages/Pushing-the-Boundaries-on-Aerial-Inspection/AdobeStock_137739028.jpeg</x:String>
    <x:String x:Key="d38d36c8-3fff-49aa-8cf2-c6b0a3efcdab.jpg">assets/SitePages/Singapore-building-update--August-2019/12891-artist_rendering.jpg</x:String>
    <x:String x:Key="229a203c-64cb-463c-b6ff-5c3e8c6fa631.jpeg">assets/SitePages/The-future-of-air-traffic--safely-sharing-the-skies-with-drones/AdobeStock_132294759.jpeg</x:String>
    <x:String x:Key="979f54ef-cb91-4c49-97b0-4d93e62c1ab2.png">assets/SitePages/The-importance-of-branding-at-Contoso/SBLB-BRANDING.png</x:String>
    <x:String x:Key="a6e4fc79-27c5-4f66-b540-fcb4ce1783c9.jpg">assets/SitePages/ThePerspective/23363-showcase.jpg</x:String>
    <x:String x:Key="4bde9cf8-20c0-41a2-a28a-32d502d1e030.jpg">assets/SitePages/ThePerspective/27137-consumer-showcase-thumb-1.jpg</x:String>
    <x:String x:Key="8561942b-8c11-4b30-afca-0bfd3a8a4c45.jpg">assets/SitePages/ThePerspective/33318-consumer-showcase-thumb-2.jpg</x:String>
    <x:String x:Key="c60d109a-21ad-4d3e-b9b4-d92168a463e8.jpg">assets/SitePages/ThePerspective/1548836252flysafe-thumb.jpg</x:String>
    <x:String x:Key="a553db37-a27f-48a1-8c25-72e3fd6479b3.jpeg">assets/SitePages/ThePerspective/AdobeStock_109868254.jpeg</x:String>
    <x:String x:Key="cfd7e6e5-0c92-4f61-8713-ae6942e9d1c6.jpeg">assets/SitePages/ThePerspective/AdobeStock_132294759.jpeg</x:String>
    <x:String x:Key="659ca9d3-081c-46c7-b0e5-23bb6e8bfaf9.jpg">assets/SitePages/ThePerspective/cta-banner.jpg</x:String>
    <x:String x:Key="abcc211e-18fc-4864-9c06-724b47164102.jpg">assets/SitePages/ThePerspective/nasa-_SFJhRPzJHs-unsplash.jpg</x:String>
    <x:String x:Key="ca166bc3-c2ec-44bf-8933-2a688d8702d2.png">assets/SitePages/Why-simplicity-matters/poster-patti-quote.png</x:String>
  </PnPFilesMap.Map>
</PnPFilesMap>

你会看到,对于在 Files 文件夹中找到的每个文件,我们在 files-map.xml 文件中都有一个匹配的条目。

手动编辑

原则上,可通过以下方式手动编辑 pnp 文件:将 zip 文件提取到文件夹、更新文件、添加文件、修改 files-map.xml 文件,但我们建议你使用 PnP PowerShell 来执行实际操作。

创建 PnP 文件

创建 PnP 文件的最简单方法是从网站提取模板并指定 .pnp 扩展名。 cmdlet 将为你执行以下操作:

Connect-PnPOnline -Url https://yourtenant.sharepoint.com/sites/yoursite
Get-PnPSiteTemplate -Out myfile.pnp

注意

PnP PowerShell 是一种开放源代码解决方案,其中包含为其提供支持的活动社区。 没有用于 Microsoft 开放源代码工具支持的 SLA。

但是,这将使你无法轻松修改模板。 更好的方法是:

  1. 创建一个配置文件,并确保至少将 persistAssetFiles 属性设置为 true,可以选择指定提取库,例如 SiteAssets、Shared Documents、WebSettings(用于徽标等)。
  2. 在文件系统上创建一个新文件夹,然后使用 PowerShell 导航到该文件夹。
  3. 将模板提取为 XML 文件,并提供配置文件:
    Connect-PnPOnline -Url https://yourtenant.sharepoint.com/sites/yoursite
    Get-PnPSiteTemplate -Out myfile.xml -Configuration ./yourconfiguration.json
    
  4. 你会发现你的文件夹中将创建一个或多个其他文件夹。 它们包含实际文件。 打开 XML 文件时,你会注意到指向这些文件的 <pnp:File /> 元素。
  5. 将模板读入内存中的对象并将其另存为 PnP 文件:
    $template = Read-PnPSiteTemplate -Path myfile.xml
    Save-PnPSiteTemplate -Out myfile.pnp -Template $template
    

注意

你还可以使用 PnP PowerShell(将 Read-PnPSiteTemplate 替换为 Read-PnPTenantTemplate 并将 Save-PnPSiteTemplate 替换为 Save-PnPTenantTemplate)来保存租户模板。 有关租户模板的详细信息,请参阅 PnP 预配租户模板

另请参阅