Freigeben über


Einführung in das PnP-Bereitstellungsmodul

In diesem Artikel wird das PnP-Bereitstellungsmodul eingeführt, das ursprünglich im April 2015 innerhalb des OfficeDev-PnP-Projekts veröffentlicht wurde und das monatlich in Ausrichtung an dem Veröffentlichungsplan der PnP-Kernbibliothek von OfficeDev aktualisiert wird.

Hinweis

Das PnP-Bereitstellungsframework & PnP-Bereitstellungsmodul sind Open-Source-Lösungen mit aktiver Community, die unterstützung dafür bereitstellt. Es gibt keine SLA für den Support des Open-Source-Tools durch Microsoft.

Das Ziel

Lassen Sie uns bei dem Hauptziel beginnen, das darin besteht, ein Bereitstellungsmodul bereitzustellen. Mit der Einführung von Microsoft Office 365 und Microsoft SharePoint Online entstand für Entwickler mit dem neuen Cloud-Add-In-Modell eine neue Möglichkeit zum Erstellen von benutzerdefinierten Softwarelösungen für Microsoft SharePoint, SharePoint Online und Office 365 im Allgemeinen. Während Entwickler in der Vergangenheit zwar benutzerdefinierte Artefakte mithilfe des CAML-/XML-basierten Feature-Frameworks entweder mit Lösungen mit voll vertrauenswürdigem Code oder mit Sandkastenlösungen bereitstellten, sollte die Bereitstellung von Artefakten in dem neuen Cloud-Add-In-Modell über die Technik der Remotebereitstellung erfolgen. Was bedeutet Remotebereitstellung? Remotebereitstellung bedeutet, dass eine der verfügbaren APIs (REST oder CSOM) zum Bereitstellen von Artefakten anstelle des Feature-Frameworks verwendet wird.

Was, wenn Sie Artefakte mithilfe einer Test- und einer Produktionsumgebung modellieren und bereitstellen möchten oder wenn Sie die Bereitstellung von Artefakten automatisieren möchten, weil Sie Ihre Anpassungen an mehrere Kunden verkaufen möchten? Und was, wenn Sie eine benutzerdefinierte Websitevorlage definieren möchten, die Sie über mehrere Instanzen hinweg wiederverwenden können, z. B. kundenorientierte Websites oder projektorientierte Websites?

Mit dem neuen PnP-Bereitstellungsmodul können Sie eine Website modellieren, indem Sie den Entwurf von Websitespalten, Inhaltstypen, Listendefinitionen und Instanzen, zusammengesetzte Designs, Seiten und vieles mehr über Ihren Webbrowser konfigurieren. Wenn Sie den Entwurf abgeschlossen haben, können Sie Ihre Arbeit in ein Bereitstellungsvorlagenformat (XML, JSON oder ein Containerformat, das als PnP-Datei bezeichnet wird) exportieren und diese Vorlage auf so viele Zielwebsites anwenden, wie Sie möchten.

Was aber, wenn Sie weitere Artefakte wie Microsoft Teams bereitstellen möchten? Oder Azure AD-Benutzer? Das PNP-Bereitstellungsmodul kann diese Arbeiten für Sie erledigen.

Zwei Arten von Vorlagen

Es gibt im Wesentlichen zwei Arten von Vorlagen, die das Modul versteht: Websitevorlagen (auch als Bereitstellungsvorlagen bezeichnet) und die erweiterte Version: Mandantenvorlagen.

Als das Modul eingeführt wurde, war der einzige verfügbare Vorlagentyp die Site-Vorlage. Nach einigen Jahren haben wir die Mandantenvorlage vorgestellt, die sich durch ihre Fähigkeit zur Bereitstellung von Artefakten jenseits des Bereichs von SharePoint-Websites unterscheidet. Eine Mandanten Vorlage ermöglicht es Ihnen beispielsweise, ein Microsoft Teams-Team, Azure AD-Benutzer, Website Designs und Website Skripts, mandantenbezogene Designs usw. bereitzustellen. Im Gegensatz zu Websitevorlagen können Sie eine sogenannte „Sequenz“ in einer Mandantenvorlage und Websitesammlungen erstellen.

Kurz gesagt: eine Mandantenvorlage ist eine Websitevorlage, die Artefakte enthalten kann, die auf Mandantenebene bereitgestellt werden können.

Erstellen einer Websitevorlage

Wie bereits erwähnt, besteht die einfachste Möglichkeit zum Erstellen einer benutzerdefinierten Bereitstellungsvorlage darin, eine frische, neue Websitesammlung in SharePoint Online zu erstellen, die Artefakte (Websitespalten, Inhaltstypen, Listen, Seiten, etc.) zu konfigurieren und das Ergebnis als Bereitstellungsvorlage zu speichern.

Angenommen, Sie haben eine Beispielwebsite mit einer benutzerdefinierten Homepage definiert:

Die Startseite einer Websitevorlage

Neben der benutzerdefinierten Homepage haben Sie in der Liste „Out-of-Box-Ereignisse“ einige Ereignisse erstellt:

Benutzerdefinierte Ereignisse in der Liste „Ereignisse“

Um diese Website als Bereitstellungsvorlage zu exportieren, können Sie entweder PowerShell oder CSOM-Code mit einigen Erweiterungsmethoden verwenden, die von der PnP-Kernbibliothek von OfficeDev bereitgestellt werden.

Verwenden von PowerShell-Cmdlets

Hinweis

Dieser Artikel befasst sich mit der Verwendung von PNP-PowerShell zum Arbeiten mit dem Bereitstellungsmodul. Wenn Sie lieber C# verwenden, lesen Sie bitte PnP-Bereitstellungsmodul und die Kernbibliothek.

Hinweis

PnP PowerShell ist eine Open Source-Lösung mit aktiver Community, die Support dafür bietet. Es gibt keine SLA für den Support des Open-Source-Tools durch Microsoft.

Um die PowerShell-Cmdlets für SharePoint Online oder SharePoint zu verwenden, wechseln Sie zur PnP PowerShell-Übersicht, und installieren Sie das SharePoint-PnP-PowerShell-Modul.

Nachdem Sie Ihre PowerShell-Umgebung mithilfe des Cmdlets Connect-PnPOnline mit SharePoint Online verbunden haben, können Sie das folgende PowerShell-Cmdlet verwenden:

Get-PnPSiteTemplate -Out "PnP-Provisioning-File.xml"

Das –Out-Argument teilt dem Cmdlet mit, wo die Bereitstellungsvorlage gespeichert werden soll.

Das Ergebnis des Extrahierens und Speicherns der Vorlage ist – je nach der im Cmdlet verwendeten Erweiterung (wir unterstützen aktuell .xml und .pnp) – eine Datei. Wenn Sie festgelegt haben, dass die Vorlage als XML-Datei gespeichert werden soll, sieht Sie wie im folgenden dargestellt aus (Beachten Sie, dass die Vorlage nicht fertig ist und nur ein Beispiel für die XML-Struktur ist):

Hinweis

Es gibt viele Konfigurationsoptionen, mit denen Sie eine Vorlage extrahieren können. Eine Erläuterung hierzu finden Sie unter Konfigurieren des PnP-Bereitstellungsmoduls.

   <?xml version="1.0"?>
<pnp:Provisioning xmlns:pnp="http://schemas.dev.office.com/PnP/2019/09/ProvisioningSchema">
  <pnp:Preferences Generator="OfficeDevPnP.Core, Version=3.14.1910.1, Culture=neutral, PublicKeyToken=null" />
  <pnp:Templates ID="CONTAINER-TEMPLATE-8F4D883BE25B442FB9F889C351D3EA0B">
    <pnp:ProvisioningTemplate ID="TEMPLATE-8F4D883BE25B442FB9F889C351D3EA0B" Version="1" BaseSiteTemplate="SITEPAGEPUBLISHING#0" Scope="RootSite">
      <pnp:WebSettings RequestAccessEmail="" NoCrawl="false" WelcomePage="SitePages/Home.aspx" SiteLogo="{hosturl}{site}/SiteAssets/__sitelogo___sitelogo_theperspective.png"/>
      <pnp:Navigation AddNewPagesToNavigation="true" CreateFriendlyUrlsForNewPages="true">
        <pnp:CurrentNavigation NavigationType="StructuralLocal">
          <pnp:StructuralNavigation RemoveExistingNodes="true">
            <pnp:NavigationNode Title="Who we are" Url="http://linkless.header/" IsExternal="true"/>
            <pnp:NavigationNode Title="What's happening" Url="http://linkless.header/" IsExternal="true"/>
            <pnp:NavigationNode Title="Find it" Url="http://linkless.header/" IsExternal="true"/>
          </pnp:StructuralNavigation>
        </pnp:CurrentNavigation>
      </pnp:Navigation>
      <pnp:Lists>
        <pnp:ListInstance Title="Events" Description="" DocumentTemplate="" TemplateType="106" Url="Lists/Events" MinorVersionLimit="0" MaxVersionLimit="0" DraftVersionVisibility="0" TemplateFeatureID="00bfea71-ec85-4903-972d-ebe475780106" ContentTypesEnabled="true" EnableFolderCreation="false" DefaultDisplayFormUrl="{site}/Lists/Events/DispForm.aspx" DefaultEditFormUrl="{site}/Lists/Events/EditForm.aspx" DefaultNewFormUrl="{site}/Lists/Events/NewForm.aspx" ImageUrl="/_layouts/15/images/itevent.png?rev=44" IrmExpire="false" IrmReject="false" IsApplicationList="false" ValidationFormula="" ValidationMessage="">
        </pnp:ListInstance>
        <pnp:DataRows KeyColumn="Title" UpdateBehavior="Overwrite">
          <pnp:DataRow>
            <pnp:DataValue FieldName="Title">Thanksgiving</pnp:DataValue>
            <pnp:DataValue FieldName="fAllDayEvent">true</pnp:DataValue>
            <pnp:DataValue FieldName="EventDate">2019-11-28 00:00:00</pnp:DataValue>
            <pnp:DataValue FieldName="EndDate">2019-11-28 23:59:00</pnp:DataValue>
          </pnp:DataRow>
          <pnp:DataRow>
            <pnp:DataValue FieldName="Title">In the design lab with Carlos Slattery</pnp:DataValue>
            <pnp:DataValue FieldName="Location">Contoso HQ</pnp:DataValue>
            <pnp:DataValue FieldName="fAllDayEvent">false</pnp:DataValue>
            <pnp:DataValue FieldName="EventDate">2020-01-02 10:00:00</pnp:DataValue>
            <pnp:DataValue FieldName="EndDate">2020-01-02 12:00:00</pnp:DataValue>
          </pnp:DataRow>
        </pnp:DataRows>
      </pnp:Lists>
      <pnp:ClientSidePages>
        <pnp:ClientSidePage PromoteAsNewsArticle="false" PromoteAsTemplate="false" Overwrite="true" Layout="Home" EnableComments="false" Title="Home" ThumbnailUrl="" PageName="Home.aspx" LCID="0">
          <pnp:Header Type="Default" LayoutType="FullWidthImage" TextAlignment="Center" ShowTopicHeader="false" ShowPublishDate="false" TopicHeader="" AlternativeText="" Authors="[]" AuthorByLine="[]" AuthorByLineId="-1" />
          <pnp:Sections>
            <pnp:Section Order="1" Type="OneColumnVerticalSection" VerticalSectionEmphasis="Soft">
              <pnp:Controls>
                <pnp:CanvasControl WebPartType="News" JsonControlData="{&quot;id&quot;: &quot;8c88f208-6c77-4bdb-86a0-0c47b4316588&quot;, &quot;instanceId&quot;: &quot;1ac6db3e-eb95-4d5d-a991-28ee34772313&quot;, ..." ControlId="8c88f208-6c77-4bdb-86a0-0c47b4316588" Order="1" Column="1" />
                <pnp:CanvasControl WebPartType="News" JsonControlData="{&quot;id&quot;: &quot;8c88f208-6c77-4bdb-86a0-0c47b4316588&quot;, &quot;instanceId&quot;: &quot;e5fc83c0-3350-4eea-9606-6627646a0a4b&quot;, &quot;title&quot;: &quot;News&quot;, &quot;description&quot;: &quot;..." ControlId="8c88f208-6c77-4bdb-86a0-0c47b4316588" Order="2" Column="1" />
                <pnp:CanvasControl WebPartType="Custom" JsonControlData="{&quot;id&quot;: &quot;868ac3c3-cad7-4bd6-9a1c-14dc5cc8e823&quot;, &quot;instanceId&quot;: &quot;c1524d29-ab2a-44a3-809e-c01c3762c4ee&quot;, &quot;title&quot;: &quot;Weather&quot;, &quot;description&quot;:..." ControlId="868ac3c3-cad7-4bd6-9a1c-14dc5cc8e823" Order="1" Column="2" />
              </pnp:Controls>
            </pnp:Section>
            <pnp:Section Order="2" Type="OneColumn">
              <pnp:Controls>
                <pnp:CanvasControl WebPartType="CallToAction" JsonControlData="{&quot;id&quot;: &quot;df8e44e7-edd5-46d5-90da-aca1539313b8&quot;, &quot;instanceId&quot;: &quot;b022816d-c9de-4989-aa10-9b44bec4a872&quot;, &quot;title&quot;: &quot;Call to action&quot;, &quot;description&quot;: &quot;Call to action&quot;, &quot;dataVersion&..." Order="1" Column="1" />
              </pnp:Controls>
            </pnp:Section>
            <pnp:Section Order="3" Type="ThreeColumn">
              <pnp:Controls>
                <pnp:CanvasControl WebPartType="Image" JsonControlData="{&quot;id&quot;: &quot;d1d91016-032f-456d-98a4-721247c305e8&quot;, &quot;instanceId&quot;: &quot;984b089c-ca62-4f92-89c0-1ce0e1cb6c03&quot;, &quot;title&quot;: &quot;Image&quot;, &quot;description&quot;: &quot;Image&quot;, &quot;dataVersion&quot;: &quot;1.8&quot;, &quot;..." ControlId="d1d91016-032f-456d-98a4-721247c305e8" Order="1" Column="1" />
                <pnp:CanvasControl WebPartType="Text" ControlId="5755396c-b272-4c0f-8e8d-eb41d218a10e" Order="2" Column="1">
                  <pnp:CanvasControlProperties>
                    <pnp:CanvasControlProperty Key="Text" Value="&lt;p&gt;&lt;span class=&quot;fontColorThemePrimary&quot;&gt;&lt;span class=&quot;fontSizeMediumPlus&quot;&gt;&lt;strong&gt;BREATHTAKING VIDEOS &amp;amp; PHOTOS&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;..." />
                  </pnp:CanvasControlProperties>
                </pnp:CanvasControl>
                <pnp:CanvasControl WebPartType="Button" JsonControlData="{&quot;id&quot;: &quot;0f087d7f-520e-42b7-89c0-496aaf979d58&quot;, &quot;instanceId&quot;: &quot;deb39e2b-11a0-4141-8ac1-1078fe7cc392&quot;, &quot;title&quot;: &quot;..." ControlId="0f087d7f-520e-42b7-89c0-496aaf979d58" Order="3" Column="1" />
                <pnp:CanvasControl WebPartType="Image" JsonControlData="{&quot;id&quot;: &quot;d1d91016-032f-456d-98a4-721247c305e8&quot;, &quot;instanceId&quot;: &quot;e0b59b5b-8a5a-406e-9deb-6e6f9de4bd3b&quot;, &quot;title&quot;: &quot;Image&quot;, ..." ControlId="d1d91016-032f-456d-98a4-721247c305e8" Order="1" Column="2" />
               </pnp:Controls>
            </pnp:Section>
          </pnp:Sections>
        </pnp:ClientSidePage>
      </pnp:ClientSidePages>
      <pnp:Header Layout="Compact" MenuStyle="MegaMenu" BackgroundEmphasis="Strong" />
      <pnp:Footer Enabled="true" RemoveExistingNodes="false" />
    </pnp:ProvisioningTemplate>
  </pnp:Templates>
</pnp:Provisioning>

Wie Sie sehen können, sind die XML-Elemente selbsterklärend. Das im Beispiel verwendete XML-Schema verweist auf die Version 201909 des PnP-Bereitstellungsschemas, die zusammen mit der SharePoint-PnP-Community definiert wurde, und die in GitHub unter PnP-Bereitstellungsschema zu finden ist. In demselben Repository finden Sie auch ein automatisch generiertes Markdown-Dokument, in dem die wichtigsten Elemente, Typen und Attribute beschrieben werden, die zur manuellen Definition einer XML-Bereitstellungsvorlage verfügbar sind.

Sie können entscheiden, ob Sie das ProvisioningTemplate-Objekt manuell mithilfe einer Modellwebsite oder durch Verfassen eines XML-Dokuments definieren, das eine Überprüfung anhand des XSD-Schemas der PnP-Bereitstellung durchführt, oder indem Sie einfach .NET-Code schreiben und die Hierarchie von Objekten erstellen. Sie können diese Ansätze sogar miteinander kombinieren: Sie können die Bereitstellungsvorlage mithilfe einer Modellwebsite entwerfen, diese als XML-Datei speichern und einige In-Memory-Anpassungen vornehmen, während die ProvisioningTemplate-Instanz in Ihrem Code verarbeitet wird.

Anwenden einer Bereitstellungsvorlage

Da Sie nun verstehen, was eine Bereitstellungsvorlage ist, können Sie sie auf eine Zielwebsite anwenden.

Nehmen wir an, Sie haben eine weitere neue Kommunikationswebsitesammlung in SharePoint Online erstellt, wie in der folgenden Abbildung dargestellt.

Die SharePoint Online-Seite zum Erstellen einer neuen Websitesammlung

Standardmäßig sieht die Website wie in der nachstehenden Abbildung aus; dies ist das Standardlayout einer Kommunikationswebsite.

Die Startseite eines frischen, neuen Ziels

Sie können nun mithilfe eines PnP-Powershell-Cmdlets eine benutzerdefinierte Websitevorlage anwenden.

Connect-PnPOnline -Url "https://yourtenant.sharepoint.com/sites/targetcommunicationsite"
Invoke-PnPSiteTemplate -Path "PnP-Provisioning-File.xml"

Das –Path-Argument verweist auf die Quellvorlagendatei, die das Cmdlet automatisch auf die aktuell verbundene Website anwendet (impliziert durch das Cmdlet Connect-PnPOnline).

Hinweis

Als Faustregel gilt: Wenn Sie eine Websitevorlage anwenden, muss die von Ihnen bearbeitete Website bereits erstellt sein und funktionieren. Wenn Sie die Website ohne Vorbereitung über eine Vorlage erstellen möchten, so müssen Sie eine Mandantenvorlage erstellen. Weitere Informationen zu Mandantenvorlagen finden Sie weiter unten.

Anwenden einer Mandantenvorlage

Eine Mandantenvorlage ähnelt einer Websitevorlage, die zusätzlich einige weitere Elemente enthält, von denen eines grundlegend ist: die Sequenz.

Eine Sequenz ist eine Konfiguration einer oder mehrerer Websitesammlungen, die erstellt werden sollen. Sehen Sie sich den folgenden Auszug aus einer Vorlage an:

<pnp:Provisioning xmlns:pnp="http://schemas.dev.office.com/PnP/2019/09/ProvisioningSchema" Author="John White" Generator="Human being" Version="1.0" Description="Home Site" DisplayName="The Perspective">
  <pnp:Sequence ID="sequence">
    <pnp:SiteCollections>
      <pnp:SiteCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="pnp:CommunicationSite" ProvisioningId="MAIN" SiteDesign="Topic" Title="My New Site" Description="" Url="/sites/mynewsite" IsHubSite="false" Owner="user@domain.com">
        <pnp:Templates>
          <pnp:ProvisioningTemplateReference ID="MAIN-TEMPLATE"/>
        </pnp:Templates>
      </pnp:SiteCollection>
    </pnp:SiteCollections>
  </pnp:Sequence>
  <pnp:Templates ID="SITE-TEMPLATES">
    <pnp:ProvisioningTemplate ID="MAIN-TEMPLATE" Version="1" BaseSiteTemplate="SITEPAGEPUBLISHING#0" Scope="RootSite">
      <pnp:Header Layout="Compact" MenuStyle="MegaMenu" BackgroundEmphasis="Strong" />

Wie Sie sehen können, wird die Reihenfolge auf der gleichen Ebene wie das <pnp:Templates />-Element definiert. Eine Sequenz kann eine oder mehrere Websites enthalten und kann auch Unterwebsites definieren. Sie können für jede Website nach der Erstellung der Website auf eine oder mehrere Vorlagen Bezug nehmen. Sie verweisen auf eine Vorlage anhand deren ID, und die Vorlagen befinden sich in diesem Beispiel in derselben XML-Datei.

Wenn Sie eine Mandantenvorlage auf einen Mandanten anwenden möchten, geben Sie Folgendes ein:

Connect-PnPOnline https://yourtenant.sharepoint.com
Invoke-PnPTenantTemplate -Path "yourtenanttemplate.xml"

Weitere Informationen zu Mandantenvorlagen finden Sie unter PNP-Bereitstellung von Mandantenvorlagen.

Erweiterte Themen

Dies ist lediglich ein einführender Artikel. Es ist wichtig zu verstehen, dass Sie bei Verwendung des PnP-Bereitstellungsmoduls auch Taxonomien bereitstellen und Variablen und Token verwenden können, die zur Laufzeit ersetzt werden können, basierend darauf, was Sie bereitstellen (z. B. Listen-IDs, Parameter oder Begriffs-IDs). Sie können das Bereitstellungsmodul aus Zeitgeberauftragsdiensten, vom Anbieter gehosteten Add-Ins, externen Websites usw. aufrufen. Sie können das PnP-Bereitstellungsmodul auch verwenden, um Artefakte aus Test-/Stagingumgebungen in Produktionsumgebungen zu verschieben.

Sie sollten auch die anderen Artikel für fortgeschrittene Themen lesen.

Anforderungen und Zusammenfassung

Um das PnP-Bereitstellungsmodul lokal auszuprobieren, müssen Sie mindestens das Kumulative Update für SharePoint 2013 vom März 2015 installiert haben, da das Modul einige Funktionen des clientseitigen Objektmodells verwendet, die nicht in früheren Versionen des Produkts verfügbar sind. Wenn Sie auf SharePoint Online abzielen, werden die Anforderungen dank des Modells „Software as a Service“ automatisch erfüllt.

Probieren Sie das PnP-Bereitstellungsmodul aus, geben Sie uns Ihr Feedback, und freuen Sie sich auf die Zukunft des SharePoint-Add-In-Modells und die Remotebereitstellung.

Siehe auch