Partager via


Comment : gérer les conflits de déploiement

Vous pouvez fournir votre propre code pour traiter des conflits de déploiement d'un élément de projet SharePoint.Par exemple, vous pouvez déterminer si des fichiers dans l'élément de projet en cours existent déjà à l'emplacement du déploiement, puis supprimer les fichiers déployés avant que l'élément de projet en cours ne soit déployé.Pour plus d'informations sur les conflits de déploiement, consultez Extension de la création de packages et du déploiement SharePoint.

Pour traiter un conflit de déploiement

  1. Créez une extension d'élément de projet, une extension de projet ou une définition d'un nouveau type d'élément de projet.Pour plus d'informations, consultez les rubriques suivantes :

  2. Dans l'extension, traitez l'événement DeploymentStepStarted d'un objet ISharePointProjectItemType (dans une extension d'élément de projet ou une extension de projet) ou d'un objet ISharePointProjectItemTypeDefinition (dans une définition d'un nouveau type d'élément de projet).

  3. Dans le gestionnaire d'événements, identifiez un conflit entre l'élément de projet en cours de déploiement et la solution déployée sur le site SharePoint, selon les critères qui s'appliquent à votre scénario.Vous pouvez utiliser la propriété ProjectItem du paramètre d'arguments d'événement pour analyser l'élément de projet en cours de déploiement, et vous pouvez analyser les fichiers à l'emplacement du déploiement en lançant une commande SharePoint définie à cet effet.

    Pour de nombreux types de conflits, vous devrez d'abord déterminer l'étape de déploiement qui est exécutée.Vous pouvez effectuer cette opération à l'aide de la propriété DeploymentStepInfo du paramètre d'arguments d'événement.Bien qu'il soit généralement raisonnable de détecter les conflits pendant l'étape de déploiement intégrée AddSolution, vous pouvez vérifier les conflits au cours de n'importe quelle étape de déploiement.

  4. S'il existe un conflit, utilisez la méthode [M:Microsoft.VisualStudio.SharePoint.Deployment.IDeploymentConflictCollection.Add(System.String,System.Func`2,System.Boolean)] de la propriété Conflicts des arguments d'événement pour créer un objet IDeploymentConflict.Cet objet représente le conflit de déploiement.Dans l'appel à la méthode [M:Microsoft.VisualStudio.SharePoint.Deployment.IDeploymentConflictCollection.Add(System.String,System.Func`2,System.Boolean)], spécifiez également la méthode qui est appelée pour résoudre le conflit.

Exemple

L'exemple de code suivant illustre le processus de base pour traiter un conflit de déploiement dans une extension d'élément de projet pour les éléments de projet de définition de liste.Pour traiter un conflit de déploiement pour un autre type d'élément de projet, passez une autre chaîne à SharePointProjectItemTypeAttribute.Pour plus d'informations, consultez Extension d'éléments de projet SharePoint.

Pour plus de simplicité, le gestionnaire d'événements DeploymentStepStarted dans cet exemple suppose l'existence d'un conflit de déploiement (autrement dit, il ajoute toujours un nouvel objet IDeploymentConflict) et la méthode Resolve retourne simplement la valeur true pour indiquer que le conflit a été résolu.Dans un scénario réel, votre gestionnaire d'événements DeploymentStepStarted identifie d'abord la présence d'un conflit entre un fichier dans l'élément de projet en cours et un fichier à l'emplacement du déploiement, puis ajoute un objet IDeploymentConflict uniquement si un conflit existe.Par exemple, vous pouvez utiliser la propriété e.ProjectItem.Files dans le gestionnaire d'événements pour analyser les fichiers dans l'élément de projet, et vous pouvez lancer une commande SharePoint pour analyser les fichiers à l'emplacement du déploiement.De même, dans un scénario réel, la méthode Resolve peut appeler une commande SharePoint pour résoudre le conflit sur le site SharePoint.Pour plus d'informations sur la création de commandes SharePoint, consultez Comment : créer une commande 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;
        }
    }
}

Compilation du code

Cet exemple nécessite des références aux assemblys suivants :

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

Déploiement de l'extension

Pour déployer l'extension, créez un package d'extension Visual Studio (VSIX) pour l'assembly et tous les autres fichiers que vous voulez distribuer avec l'extension.Pour plus d'informations, consultez Déploiement d'extensions pour les outils SharePoint dans Visual Studio.

Voir aussi

Concepts

Extension de la création de packages et du déploiement SharePoint

Extension d'éléments de projet SharePoint

Comment : exécuter le code lors de l'exécution des étapes de déploiement

Comment : créer une commande SharePoint