Exemple d’application console d’approvisionnement

Pour prendre en charge le nouveau modèle de complément, le programme de pratiques et modèles de développement d’Office 365 a introduit une infrastructure d’approvisionnement permettant aux utilisateurs d’effectuer les opérations suivantes :

  • Créer des modèles de site personnalisés en pointant simplement sur un modèle de site.
  • Conserver le modèle en tant que modèle d’approvisionnement.
  • Appliquer le modèle personnalisé à des collections de sites existantes le cas échéant.

Remarque

L’infrastructure d’approvisionnement PnP & moteur d’approvisionnement PnP sont des solutions open source avec une communauté active qui le prend en charge. Il n’existe pas de contrat SLA Microsoft pour le support technique relatif à cet outil open source.

Dans cet exemple, nous créons une application console de base qui implémente des classes dans la bibliothèque principale de pratiques et modèles d’approvisionnement pour permettre au moteur d’approvisionnement de pratiques et modèles d’accomplir les tâches d’approvisionnement essentielles suivantes :

  • Concevoir et modéliser la personnalisation de votre site. Il peut s’agir d’une nouvelle conception de site ou vous pouvez pointer sur un site existant et l’enregistrer en tant que modèle d’approvisionnement.
  • Enregistrer et conserver le modèle de site en tant que modèle d’approvisionnement réutilisable.
  • Appliquer le modèle d’approvisionnement à une collection de sites existante ou nouvelle.

Remarque

Cet exemple de procédure pas à pas accompagne un exemple actuellement disponible sur GitHub dans l’article concernant la prise en main du moteur d’approvisionnement de pratiques et modèles. Le code (Program.cs) et les fichiers de solution de l’exemple sont disponibles en téléchargement. Une présentation vidéo de 20 minutes de ce processus (avec un code légèrement différent) est également disponible sur le site Channel 9 de Microsoft, concernant la prise en main du moteur d’approvisionnement de pratiques et modèles.

Créer et préparer un projet Visual Studio

Pour commencer, créez un projet Visual Studio. Dans cet exemple, par souci de simplicité, nous créons une application console de base qui implémente le moteur d’approvisionnement de pratiques et modèles en utilisant la bibliothèque principale de pratiques et modèles de l’infrastructure d’approvisionnement. Cependant, pour prendre en charge l’exemple de solution, nous devons télécharger et installer l’infrastructure d’approvisionnement de la bibliothèque principale de pratiques et modèles.

  1. Ouvrez Visual Studio, puis choisissez Fichier>Nouveau>Projet.

  2. Dans l'Assistant Nouveau projet, choisissez Visual C#, puis Application console.

  3. Nommez le projet Programme, puis cliquez sur OK. (vous pouvez nommer le projet comme bon vous semble, mais sachez que cette procédure pas à pas fait référence au projet nommé Programme).

  4. Téléchargez et installez la bibliothèque PnP Core disponible sous forme de package NuGet dans les packages SharePointPnPCore.

    Remarque

    Il existe trois versions de la bibliothèque. L’une de ces versions est la bibliothèque SharePointPnPCoreOnline qui cible SharePoint Online et Office 365. Les autres versions sont SharePointPnPCore2013 et SharePointPnPCore2016, qui ciblent respectivement les versions 2013 et 2016 locales de SharePoint.

  5. Installez le client NuGet en accédant au programme d’installation de client NuGet.

  6. Une fois le client NuGet installé, exécutez le Gestionnaire de package NuGet. Dans l’Explorateur de solutions Visual Studio, cliquez avec le bouton droit sur le nœud Références, puis sélectionnez Gérer les packages NuGet.

  7. Dans le Gestionnaire de Package, sélectionnez Parcourir, puis entrez le critère de recherche Pratiques et modèles SharePoint afin d’exposer la bibliothèque SharePointPnPCoreOnline.

  8. Suivez les instructions pour télécharger et installer la bibliothèque SharePointPnPCoreOnline.

    Une fois la bibliothèque principale de pratiques et modèles référencée dans votre projet Visual Studio, vous pouvez accéder à tous les membres de la bibliothèque tels que des méthodes d’extension sur des instances d’objet existantes, par exemple, des instances web et liste.

  9. Assurez-vous que votre fichier Program.cs contient toutes les instructions using suivantes.

    using Microsoft.SharePoint.Client;
    using OfficeDevPnP.Core.Framework.Provisioning.Connectors;
    using OfficeDevPnP.Core.Framework.Provisioning.Model;
    using OfficeDevPnP.Core.Framework.Provisioning.ObjectHandlers;
    using OfficeDevPnP.Core.Framework.Provisioning.Providers.Xml;
    using System;
    using System.Net;
    using System.Security;
    using System.Threading;
    

Créer, extraire et conserver le modèle d’approvisionnement

Une fois votre projet configuré, vous pouvez créer vos personnalisations de site. Vous pouvez le faire manuellement ou en pointant sur un site dont vous souhaitez utiliser la conception. Enregistrez simplement la conception de site sélectionnée comme modèle d’approvisionnement, ou utilisez une combinaison des deux approches. Pour les besoins de cet exemple, nous allons simplement pointer sur un site existant et enregistrer son apparence composée et ses artefacts (mais pas son contenu) en tant que modèle d’approvisionnement.

Pour commencer, nous devons nous connecter au site que nous souhaitons modéliser en tant que modèle d’approvisionnement. Commençons par collecter les informations de connexion, dont le nom et le mot de passe d’utilisateur, ainsi que l’URL source.

  1. Collectez les informations de connexion de l’utilisateur. Dans la routine Main du programme, nous effectuons trois opérations simples : collecter les informations de connexion, obtenir le modèle d’approvisionnement et appliquer celui-ci. Les tâches lourdes sont effectuées par les méthodes GetProvisioningTemplate et ApplyProvisioningTemplate que nous définissons ci-après.

    static void Main(string[] args)
    {
      ConsoleColor defaultForeground = Console.ForegroundColor;
    
      // Collect information
      string templateWebUrl = GetInput("Enter the URL of the template site: ", false, defaultForeground);
      string targetWebUrl = GetInput("Enter the URL of the target site: ", false, defaultForeground);
      string userName = GetInput("Enter your user name:", false, defaultForeground);
      string pwdS = GetInput("Enter your password:", true, defaultForeground);
      SecureString pwd = new SecureString();
      foreach (char c in pwdS.ToCharArray()) pwd.AppendChar(c);
    
      // GET the template from existing site and serialize
      // Serializing the template for later reuse is optional
      ProvisioningTemplate template = GetProvisioningTemplate(defaultForeground, templateWebUrl, userName, pwd);
    
      // APPLY the template to new site from
      ApplyProvisioningTemplate(targetWebUrl, userName, pwd, template);
    
      // Pause and modify the UI to indicate that the operation is complete
      Console.ForegroundColor = ConsoleColor.White;
      Console.WriteLine("We're done. Press Enter to continue.");
      Console.ReadLine();
    }
    
  2. Créez et utilisez une méthode privée GetInput pour obtenir les informations d’identification de l’utilisateur requises.

    private static string GetInput(string label, bool isPassword, ConsoleColor defaultForeground)
    {
      Console.ForegroundColor = ConsoleColor.Green;
      Console.WriteLine("{0} : ", label);
      Console.ForegroundColor = defaultForeground;
    
      string value = "";
    
      for (ConsoleKeyInfo keyInfo = Console.ReadKey(true); keyInfo.Key != ConsoleKey.Enter; keyInfo = Console.ReadKey(true))
      {
        if (keyInfo.Key == ConsoleKey.Backspace)
        {
          if (value.Length > 0)
          {
            value = value.Remove(value.Length - 1);
            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
            Console.Write(" ");
            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
          }
        }
        else if (keyInfo.Key != ConsoleKey.Enter)
        {
          if (isPassword)
          {
            Console.Write("*");
          }
          else
          {
            Console.Write(keyInfo.KeyChar);
          }
          value += keyInfo.KeyChar;
        }
      }
      Console.WriteLine("");
    
      return value;
    }
    
  3. Pointez sur le site à la base de notre modèle d’approvisionnement. Lorsque vous appliquez la commande GET au site source avec une seule ligne de code, examinez GetProvisioningTemplate() qui est la méthode GET que nous avons définie.

    private static ProvisioningTemplate GetProvisioningTemplate(ConsoleColor defaultForeground, string webUrl, string userName, SecureString pwd)
    {
      using (var ctx = new ClientContext(webUrl))
      {
        // ctx.Credentials = new NetworkCredentials(userName, pwd);
        ctx.Credentials = new SharePointOnlineCredentials(userName, pwd);
        ctx.RequestTimeout = Timeout.Infinite;
    
        // Just to output the site details
        Web web = ctx.Web;
        ctx.Load(web, w => w.Title);
        ctx.ExecuteQueryRetry();
    
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Your site title is:" + ctx.Web.Title);
        Console.ForegroundColor = defaultForeground;
    
        ProvisioningTemplateCreationInformation ptci
                = new ProvisioningTemplateCreationInformation(ctx.Web);
    
        // Create FileSystemConnector to store a temporary copy of the template
        ptci.FileConnector = new FileSystemConnector(@"c:\temp\pnpprovisioningdemo", "");
        ptci.PersistComposedLookFiles = true;
        ptci.ProgressDelegate = delegate(String message, Int32 progress, Int32 total)
        {
            // Only to output progress for console UI
            Console.WriteLine("{0:00}/{1:00} - {2}", progress, total, message);
        };
    
        // Execute actual extraction of the template
        ProvisioningTemplate template = ctx.Web.GetProvisioningTemplate(ptci);
    
        // We can serialize this template to save and reuse it
        // Optional step
        XMLTemplateProvider provider =
                new XMLFileSystemTemplateProvider(@"c:\temp\pnpprovisioningdemo", "");
        provider.SaveAs(template, "PnPProvisioningDemo.xml");
    
        return template;
      }
    }
    

    Dans l’extrait de code précédent, nous avons également défini une variable ProvisioningTemplateCreationInformation, pcti. La variable nous donne la possibilité de stocker des informations sur les artefacts que nous pouvons enregistrer avec le modèle.

  4. Créez un objet connecteur de système de fichiers afin de pouvoir stocker une copie temporaire du modèle d’approvisionnement que nous allons appliquer à un autre site.

    Remarque

    Cette étape est facultative. Il n’est pas requis de sérialiser le modèle d’approvisionnement en code XML. À ce stade, le modèle est simplement du code C#. La sérialisation est facultative, et vous pouvez également utiliser le format de sérialisation de votre choix.

  5. Exécutez l’extraction du modèle d’approvisionnement en utilisant uniquement cette simple ligne de code :

    ProvisioningTemplate template = ctx.Web.GetProvisioningTemplate(ptci);
    
  6. (Facultatif) Enregistrez et stockez une version sérialisée du modèle d’approvisionnement réutilisable. Vous pouvez sérialiser le modèle d’approvisionnement dans le format de votre choix. Dans cet exemple, nous avons effectué la sérialisation dans un fichier XML nommé PnPProvisioningDemo.xml. Le fichier lui-même est un objet XMLFileSystemTemplateProvider pour lequel nous avons fourni un emplacement de système de fichiers.

Appliquer le modèle d’approvisionnement à un site nouveau ou existant

Une fois le modèle d’approvisionnement extrait, enregistré et conservé, l’étape suivante consiste à l’appliquer à une nouvelle collection de sites SharePoint à l’aide de la méthode ApplyProvisioningTemplate.

  1. Mappez les informations d’identification au site cible.

    // ctx.Credentials = new NetworkCredentials(userName, pwd);
    ctx.Credentials = new SharePointOnlineCredentials(userName, pwd);
    ctx.RequestTimeout = Timeout.Infinite;
    
  2. Capturez les artefacts de site stockés à l’aide de la méthode ProvisioningTemplateCreationInformation en utilisant la méthode associée ProvisioningTemplateApplyingInformation.

    ProvisioningTemplateApplyingInformation ptai = new ProvisioningTemplateApplyingInformation();
    ptai.ProgressDelegate = delegate(String message, Int32 progress, Int32 total)
    {
      Console.WriteLine("{0:00}/{1:00} - {2}", progress, total, message);
    };
    
  3. Obtenez une association au connecteur de fichier pour les éléments.

    // Associate file connector for assets
    FileSystemConnector connector = new FileSystemConnector(@"c:\temp\pnpprovisioningdemo", "");
    template.Connector = connector;
    
  4. (Facultatif) Le modèle d’approvisionnement étant une instance d’objet, nous pouvons écrire du code pour personnaliser les artefacts du site à la volée. Dans ce cas, nous ajoutons une nouvelle liste de « contacts ».

    // Because the template is actual object, we can modify this using code as needed
    template.Lists.Add(new ListInstance()
    {
      Title = "PnP Sample Contacts",
      Url = "lists/PnPContacts",
      TemplateType = (Int32)ListTemplateType.Contacts,
      EnableAttachments = true
    });
    
  5. Appliquez le modèle d’approvisionnement au nouveau site en utilisant de nouveau une ligne de code.

    web.ApplyProvisioningTemplate(template, ptai);
    
  6. L’implémentation de la méthode ApplyProvisioningTemplate() est indiquée ci-dessous.

    private static void ApplyProvisioningTemplate(string targetWebUrl, string userName, SecureString pwd, ProvisioningTemplate template)
    {
      using (var ctx = new ClientContext(targetWebUrl))
      {
        // ctx.Credentials = new NetworkCredentials(userName, pwd);
        ctx.Credentials = new SharePointOnlineCredentials(userName, pwd);
        ctx.RequestTimeout = Timeout.Infinite;
    
        Web web = ctx.Web;
    
        ProvisioningTemplateApplyingInformation ptai = new ProvisioningTemplateApplyingInformation();
        ptai.ProgressDelegate = delegate (String message, Int32 progress, Int32 total)
        {
          Console.WriteLine("{0:00}/{1:00} - {2}", progress, total, message);
        };
    
        // Associate file connector for assets
        FileSystemConnector connector = new FileSystemConnector(@"c:\temp\pnpprovisioningdemo", "");
        template.Connector = connector;
    
        // Because the template is actual object, we can modify this using code as needed
        template.Lists.Add(new ListInstance()
        {
          Title = "PnP Sample Contacts",
          Url = "lists/PnPContacts",
          TemplateType = (Int32)ListTemplateType.Contacts,
          EnableAttachments = true
        });
    
        web.ApplyProvisioningTemplate(template, ptai);
      }
    }
    

Voir aussi