Exemplo de provisionamento para Aplicativo do Console
Para oferecer suporte ao novo modelo de suplemento, o programa de Padrões e Práticas (PnP) desenvolvedor do Office 365 introduziu uma estrutura de provisionamento que permite aos usuários:
- Criar modelos de site personalizados simplesmente apontando para um modelo de site.
- Persistir o modelo como um modelo de provisionamento.
- Aplique o modelo personalizado a conjuntos de sites novos ou existentes, conforme necessário.
Observação
O PnP Provisioning Framework & Mecanismo de Provisionamento PnP são soluções de software livre com a comunidade ativa fornecendo suporte para ele. Não há nenhuma SLA para o suporte da ferramenta de software livre por parte da Microsoft.
Neste exemplo, criamos um aplicativo de console básico que implementa classes na biblioteca PnP Core de provisionamento para permitir que o mecanismo de provisionamento PnP conclua essas tarefas essenciais de provisionamento:
- Projetar e criar sua personalização de site. Isso pode ser um novo design de site, ou você pode apontar para um site existente e salvá-lo como um modelo de provisionamento.
- Salve e persista o modelo de site como um modelo de provisionamento para que você possa reutilizá-lo.
- Aplique o modelo de provisionamento a um conjunto de sites novo ou existente.
Observação
Este passo a passo de exemplo é um complemento para uma amostra atualmente disponível no GitHub em Introdução ao mecanismo de provisionamento de PnP. O código (Program.cs) e os arquivos de solução para o exemplo estão disponíveis para download. Há também uma apresentação em vídeo de 20 minutos desse processo (com código ligeiramente diferente) disponível no site do Microsoft Channel 9, Introdução ao mecanismo de provisionamento PnP.
Crie e prepare um projeto do Visual Studio
Para começar, crie um projeto do Visual Studio. Neste exemplo, para simplificar, criamos um aplicativo de console básico que implementa o mecanismo de provisionamento PnP usando a biblioteca PnP Core da estrutura de provisionamento. Para ter suporte à solução de amostra, no entanto, devemos fazer o download e instalar a estrutura de provisionamento da biblioteca PnP Core.
Abra o Visual Studio e escolha Arquivo>Novo>Projeto.
No Novo Assistente de Projeto, escolha Visual C # e, em seguida, escolha Aplicativo de console.
Dê um nome ao projeto Programa, e em seguida escolha OK. (Você pode nomear o projeto como quiser, mas esteja ciente de que este passo a passo fará referência ao projeto com o nome de Programa.)
Baixe e instale a biblioteca PnP Core que está disponível como um pacote NuGet nos Pacotes SharePointPnPCore.
Observação
Há três versões da biblioteca. Uma versão é a biblioteca SharePointPnPCoreOnline, direcionada ao SharePoint Online e Office 365. As outras versões são SharePointPnPCore2013 e SharePointPnPCore2016, que visam às versões locais do SharePoint 2013 e 2016, respectivamente.
Instale o cliente NuGet acessando o instalador do cliente NuGet.
Depois que o cliente NuGet for instalado, execute o gerenciador de Pacotes NuGet. Clique com o botão direito do mouse no nó Referências no Explorador de Soluções do Visual Studio e, em seguida, selecione Gerenciar Pacotes NuGet.
No Gerenciador de Pacotes, escolha Procurar e insira o termo de pesquisa SharePoint PnP para expor a biblioteca SharePointPnPCoreOnline.
Siga as instruções para baixar e instalar a biblioteca SharePointPnPCoreOnline, seguindo as instruções fornecidas.
Depois que a biblioteca PnP Core for referenciada em seu projeto do Visual Studio, todos os membros da biblioteca estarão disponíveis para você como métodos de extensão em instâncias de objetos existentes, por exemplo, instâncias da web e de lista.
Certifique-se de que seu arquivo Program.cs contenha todas as instruções
using
a seguir.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;
Criar, extrair e persistir o modelo de provisionamento
Depois de configurar o seu projeto, você pode criar suas personalizações de site. Você pode fazer isso manualmente, ou apontando para um site com design que você deseje usar. Basta salvar o design do site escolhido como um modelo de provisionamento ou usar uma combinação das duas abordagens. Para o propósito deste exemplo, simplesmente apontaremos para um site existente e salvaremos seus artefatos de aparência e site compostos (mas não seu conteúdo) como um modelo de provisionamento.
Para começar, precisamos nos conectar ao site que desejamos usar como nosso modelo de provisionamento. Vamos começar coletando informações de conexão, incluindo nome de usuário, senha e URL de origem.
Colete informações de conexão do usuário. Observe que na rotina
Main
do programa, fazemos três coisas simples: coletar informações de conexão, obter o modelo de provisionamento e APLICAR o modelo de provisionamento. O trabalho pesado é feito pelos métodos GetProvisioningTemplate e ApplyProvisioningTemplate que definimos a seguir.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(); }
Crie e use um método GetInput privado para obter as credenciais de usuário necessárias.
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; }
Aponte para o site que é o modelo do nosso modelo de provisionamento. Ao fazer o GET no site de origem com uma única linha de código, veja
GetProvisioningTemplate()
, que é o método GET que definimos.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; } }
No trecho de código anterior, também definimos uma variável ProvisioningTemplateCreationInformation, pcti. A variável nos dá a opção de armazenar informações sobre artefatos que podemos salvar junto com o modelo.
Crie um objeto conector do sistema de arquivos para que possamos armazenar uma cópia temporária do modelo de provisionamento que vamos aplicar a outro site.
Observação
Essa etapa é opcional. Não é necessário que você serialize o modelo de fornecimento para XML. Nesta fase, o modelo é simplesmente código C #. Não somente a serialização é opcional, como você também pode usar qualquer formato de serialização que desejar.
Execute a extração do modelo de provisionamento usando esta linha única de código apenas:
ProvisioningTemplate template = ctx.Web.GetProvisioningTemplate(ptci);
(Opcional) Salve e armazene uma versão serializada do modelo de provisionamento para poder reutilizá-lo. Você pode serializar o modelo de provisionamento no formato que preferir. Neste exemplo, serializamos para um arquivo XML chamado PnPProvisioningDemo.xml. O arquivo em si é um objeto XMLFileSystemTemplateProvider para o qual fornecemos um local do sistema de arquivos.
Aplicar o modelo de provisionamento a um site novo ou existente
Depois de extrair, salvar e persistir o modelo de provisionamento, a próxima e última etapa é aplicar o modelo de provisionamento a um novo conjunto de sites do SharePoint usando o método ApplyProvisioningTemplate.
Obtenha credenciais para o site destino.
// ctx.Credentials = new NetworkCredentials(userName, pwd); ctx.Credentials = new SharePointOnlineCredentials(userName, pwd); ctx.RequestTimeout = Timeout.Infinite;
Capture os artefatos do site que foram armazenados usando o método ProvisioningTemplateCreationInformation usando o método complementar, ProvisioningTemplateApplyingInformation.
ProvisioningTemplateApplyingInformation ptai = new ProvisioningTemplateApplyingInformation(); ptai.ProgressDelegate = delegate(String message, Int32 progress, Int32 total) { Console.WriteLine("{0:00}/{1:00} - {2}", progress, total, message); };
Obter uma associação para o conector de arquivo para os ativos.
// Associate file connector for assets FileSystemConnector connector = new FileSystemConnector(@"c:\temp\pnpprovisioningdemo", ""); template.Connector = connector;
(Opcional) Como o modelo de provisionamento é uma instância de objeto, podemos escrever código para personalizar artefatos de site rapidamente. Neste caso, estamos adicionando uma nova lista de "contatos".
// 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 });
Aplique o modelo de provisionamento ao novo site, novamente usando uma linha de código.
web.ApplyProvisioningTemplate(template, ptai);
Toda a implementação do método
ApplyProvisioningTemplate()
está abaixo.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); } }