Condividi tramite


Procedura: gestire i conflitti di distribuzione

È possibile fornire il proprio codice ai conflitti di distribuzione dell'handle per un elemento di progetto SharePoint.Ad esempio, è possibile determinare se i file nell'elemento di progetto corrente sono già presenti nel percorso di distribuzione, quindi eliminare i file distribuiti prima della distribuzione dell'elemento di progetto corrente.Per ulteriori informazioni sui conflitti di distribuzione, vedere Estensione della creazione di pacchetti e della distribuzione di SharePoint.

Per gestire un conflitto di distribuzione

  1. Creare un'estensione di elemento di progetto, un'estensione di progetto o una definizione di un nuovo tipo di elemento di progetto.Per ulteriori informazioni, vedere i seguenti argomenti:

  2. Nell'estensione gestire l'evento DeploymentStepStarted di un oggetto ISharePointProjectItemType (in un'estensione di elemento di progetto o in un'estensione di progetto) o ISharePointProjectItemTypeDefinition (in una definizione di un nuovo tipo di elemento di progetto).

  3. Nel gestore eventi determinare se esiste un conflitto tra l'elemento di progetto che si sta distribuendo e la soluzione distribuita nel sito di SharePoint, in base ai criteri che si applicano allo scenario.È possibile utilizzare la proprietà ProjectItem del parametro degli argomenti dell'evento per analizzare l'elemento del progetto che si sta distribuendo ed è possibile analizzare i file nel percorso di distribuzione chiamando un comando di SharePoint definito per questo scopo.

    Per molti tipi di conflitti è possibile che si voglia innanzitutto determinare quale passaggio relativo alla distribuzione viene eseguito.È possibile eseguire questa operazione utilizzando la proprietà DeploymentStepInfo del parametro degli argomenti dell'evento.Sebbene in genere sia opportuno rilevare i conflitti durante il passaggio relativo alla distribuzione AddSolution incorporato, è possibile verificare se esistono conflitti durante qualsiasi passaggio relativo alla distribuzione.

  4. In caso di conflitti, utilizzare il metodo [M:Microsoft.VisualStudio.SharePoint.Deployment.IDeploymentConflictCollection.Add(System.String,System.Func`2,System.Boolean)] della proprietà Conflicts degli argomenti dell'evento per creare un nuovo oggetto IDeploymentConflict.Questo oggetto rappresenta il conflitto di distribuzione.Nella chiamata al metodo [M:Microsoft.VisualStudio.SharePoint.Deployment.IDeploymentConflictCollection.Add(System.String,System.Func`2,System.Boolean)] specificare anche il metodo chiamato per risolvere il conflitto.

Esempio

Nell'esempio di codice riportato di seguito viene illustrato il processo di base per gestire un conflitto di distribuzione in un'estensione di elemento di progetto per gli elementi del progetto di definizione di elenco.Per gestire un conflitto di distribuzione per un altro tipo di elemento di progetto, passare una stringa diversa a SharePointProjectItemTypeAttribute.Per ulteriori informazioni, vedere Estensione di elementi di progetto SharePoint.

Per semplicità, nel gestore eventi DeploymentStepStarted in questo esempio si presuppone che un conflitto di distribuzione esista (ovvero, aggiunge sempre un nuovo oggetto IDeploymentConflict) e il metodo Resolve restituisca semplicemente true per indicare che il conflitto è stato risolto.In uno scenario reale il gestore eventi DeploymentStepStarted innanzitutto determinerebbe se esiste un conflitto tra un file nell'elemento di progetto corrente e un file nel percorso di distribuzione e quindi aggiungerebbe un oggetto IDeploymentConflict solo in presenza di un conflitto.Ad esempio, è possibile utilizzare la proprietà e.ProjectItem.Files nel gestore eventi per analizzare i file nell'elemento di progetto e chiamare un comando di SharePoint per analizzare i file nel percorso di distribuzione.Analogamente, in uno scenario reale il metodo Resolve potrebbe chiamare un comando di SharePoint per risolvere il conflitto sul sito di SharePoint.Per ulteriori informazioni sulla creazione di comandi di SharePoint, vedere Procedura: creare un comando di SharePoint.

Imports Microsoft.VisualStudio.SharePoint
Imports Microsoft.VisualStudio.SharePoint.Deployment
Imports System.ComponentModel.Composition

<Export(GetType(ISharePointProjectItemTypeExtension))>
<SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.ListDefinition")>
Public Class DeploymentConflictExtension
    Implements ISharePointProjectItemTypeExtension

    Private Sub Initialize(ByVal projectItemType As ISharePointProjectItemType) _
    Implements ISharePointProjectItemTypeExtension.Initialize
        AddHandler projectItemType.DeploymentStepStarted, AddressOf DeploymentStepStarted
    End Sub

    Private Sub DeploymentStepStarted(ByVal Sender As Object, ByVal e As DeploymentStepStartedEventArgs)
        If e.DeploymentStepInfo.Id = DeploymentStepIds.AddSolution Then
            e.Conflicts.Add("This is an example conflict", AddressOf Me.Resolve, True)
            e.ProjectItem.Project.ProjectService.Logger.WriteLine("Added new example conflict.", LogCategory.Status)
        End If
    End Sub

    Private Function Resolve(ByVal projectItem As ISharePointProjectItem) As Boolean
        projectItem.Project.ProjectService.Logger.WriteLine("Returning 'true' from Resolve method for example conflict.",
            LogCategory.Status)
        Return True
    End Function
End Class
using Microsoft.VisualStudio.SharePoint;
using Microsoft.VisualStudio.SharePoint.Deployment;
using System.ComponentModel.Composition;

namespace Contoso.DeploymentConflictExtension
{
    [Export(typeof(ISharePointProjectItemTypeExtension))]
    [SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.ListDefinition")]
    class DeploymentConflictExtension : ISharePointProjectItemTypeExtension
    {
        public void Initialize(ISharePointProjectItemType projectItemType)
        {
            projectItemType.DeploymentStepStarted += DeploymentStepStarted;
        }

        private void DeploymentStepStarted(object sender, DeploymentStepStartedEventArgs e)
        {
            if (e.DeploymentStepInfo.Id == DeploymentStepIds.AddSolution)
            {
                e.Conflicts.Add("This is an example conflict", this.Resolve, true);
                e.ProjectItem.Project.ProjectService.Logger.WriteLine("Added new example conflict.", LogCategory.Status);
            }
        }

        private bool Resolve(ISharePointProjectItem projectItem)
        {
            projectItem.Project.ProjectService.Logger.WriteLine("Returning 'true' from Resolve method for example conflict.", 
                LogCategory.Status);
            return true;
        }
    }
}

Compilazione del codice

In questo esempio sono richiesti riferimenti agli assembly seguenti:

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

Distribuzione dell'estensione

Per distribuire l'estensione, creare un pacchetto Visual Studio Extension (VSIX) per l'assembly e qualsiasi altro file che si desidera distribuire con l'estensione.Per ulteriori informazioni, vedere Distribuzione di estensioni per gli strumenti di SharePoint in Visual Studio.

Vedere anche

Concetti

Estensione della creazione di pacchetti e della distribuzione di SharePoint

Estensione di elementi di progetto SharePoint

Procedura: eseguire codice all'esecuzione dei passaggi di distribuzione

Procedura: creare un comando di SharePoint