Compartir a través de


Cómo: Controlar conflictos de implementación

Puede proporcionar su propio código para controlar los conflictos de implementación para un elemento de proyecto de SharePoint.Por ejemplo, puede determinar si algunos archivos del elemento de proyecto actual ya existen en la ubicación de implementación y, a continuación, eliminar los archivos implementados antes de implementar el elemento de proyecto actual.Para obtener más información sobre los conflictos de implementación, vea Extender el empaquetado e implementación de SharePoint.

Para controlar un conflicto de implementación

  1. Cree una extensión de elemento de proyecto, una extensión de proyecto o una definición de un nuevo tipo de elemento de proyecto.Para obtener más información, vea los temas siguientes:

  2. En la extensión, controle el evento DeploymentStepStarted de un objeto ISharePointProjectItemType (en una extensión de elemento de proyecto o en una extensión de proyecto) o de un objeto ISharePointProjectItemTypeDefinition (en una definición de un nuevo tipo de elemento de proyecto).

  3. En el controlador de eventos, determine si hay un conflicto entre el elemento de proyecto que se implementa y la solución implementada en el sitio de SharePoint, basándose en los criterios que se aplican a su escenario.Puede usar la propiedad ProjectItem del parámetro de argumentos del evento para analizar el elemento de proyecto que se implementa y puede analizar los archivos en la ubicación de implementación si llama a un comando de SharePoint definido para este propósito.

    Para muchos tipos de conflictos, sería conveniente determinar primero qué paso de implementación se está ejecutando.Puede hacerlo mediante la propiedad DeploymentStepInfo del parámetro de argumentos del evento.Aunque normalmente tiene sentido detectar los conflictos durante el paso de implementación integrado de AddSolution, puede comprobar si existen conflictos durante cualquier paso de la implementación.

  4. Si existe un conflicto, use el método [M:Microsoft.VisualStudio.SharePoint.Deployment.IDeploymentConflictCollection.Add(System.String,System.Func`2,System.Boolean)] de la propiedad Conflicts de los argumentos del evento para crear un nuevo objeto IDeploymentConflict.Este objeto representa el conflicto de implementación.En la llamada al método [M:Microsoft.VisualStudio.SharePoint.Deployment.IDeploymentConflictCollection.Add(System.String,System.Func`2,System.Boolean)], especifique también el método al que se llama para resolver el conflicto.

Ejemplo

En el ejemplo de código siguiente se muestra el proceso básico para controlar un conflicto de implementación en una extensión de elemento de proyecto para los elementos de proyecto de la definición de lista.Para controlar un conflicto de implementación en un tipo diferente de elemento de proyecto, pase una cadena diferente a SharePointProjectItemTypeAttribute.Para obtener más información, vea Extender elementos de proyecto de SharePoint.

Para simplificar, en el controlador de eventos DeploymentStepStarted de este ejemplo se supone que existe un conflicto de implementación (es decir, siempre agrega un nuevo objeto IDeploymentConflict) y el método Resolve simplemente devuelve true para indicar que el conflicto se resolvió.En un escenario real, el controlador de eventos DeploymentStepStarted determinaría primero si existe un conflicto entre un archivo del elemento de proyecto actual y un archivo almacenado en la ubicación de implementación y, a continuación, agregaría un objeto IDeploymentConflict solo si existe un conflicto.Por ejemplo, podría usar la propiedad e.ProjectItem.Files en el controlador de eventos para analizar los archivos del elemento de proyecto y podría llamar a un comando de SharePoint de analizar los archivos en la ubicación de implementación.De igual forma, en un escenario real el método Resolve podría llamar a un comando de SharePoint para resolver el conflicto en el sitio de SharePoint.Para obtener más información sobre la creación de comandos de SharePoint, vea Cómo: Crear un comando de 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;
        }
    }
}

Compilar el código

Para este ejemplo se requieren referencias a los siguientes ensamblados:

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

Implementar la extensión

Para implementar la extensión, cree un paquete de extensión (VSIX) de Visual Studio para el ensamblado y el resto de archivos que desee distribuir con la extensión.Para obtener más información, vea Extensiones de implementación para las Herramientas de SharePoint en Visual Studio.

Vea también

Conceptos

Extender el empaquetado e implementación de SharePoint

Extender elementos de proyecto de SharePoint

Cómo: Ejecutar código cuando se ejecutan los pasos de implementación

Cómo: Crear un comando de SharePoint