Arquitectura, buenas prácticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016

La importancia de PowerShell para los desarrolladores

Cada vez es más frecuente los perfiles denominados DevOps, según la Wikipedia es un acrónimo inglés de development (desarrollo) y operations (operaciones), que se refiere a una metodología de desarrollo de software que se centra en la comunicación, colaboración e integración entre desarrolladores de software y los profesionales de operaciones en las tecnologías de la información (IT). DevOps es una respuesta a la interdependencia del desarrollo de software y las operaciones IT. Su objetivo es ayudar a una organización a producir productos y servicios software rápidamente. Este tipo de perfiles son muy comunes dentro del mundo de SharePoint  debido a que para poder desarrollar de forma correcta debes de conocer sus limites y aspectos para administrar nuestro servidor favorito.

PowerShell es la herramienta/lenguaje de programación para unificar a los administradores de sistemas y a los desarrolladores. PowerShell ha ido cogiendo fuerza dentro de SharePoint, hasta tal punto que ha substituido a la acciones realizadas mediante la Interfaz de Usuario, y ha dejado en obsoleto el anterior comando.

Motivos

  • Mayor velocidad de acceso
  • No hace falta instalar nada sobre la granja
  • Herramienta para chequear el estado de la granja
  • Extensible con la potencia que da el lenguaje
  • Despliegue de soluciones

De todos estos puntos, vamos a centrarnos en el último motivo: el despliegue de soluciones. El ciclo de vida del desarrollo dentro de SharePoint es un tanto peculiar y se puede hacer de muchas formas. Correctamente en mi opinión hay dos:

  1. Mediante Features: todo artefacto (columnas de sitio, tipos de contenido, webparts, masterpages,etc..) que se haga sobre nuestro site-colection tiene una feature (bien a nivel de site,farm,web) que lo despliega sobre la granja.
  2. Mezclando PowerShell + Features: Mediante PowerShell desplegamos los artefactos de infraestructura de la granja (columnas de sitio, tipos de contenido, site), activamos las características que correspondan y realizamos la configuración de los servicios que toque. E implementamos Features donde estarán los elementos de diseño(css, master-page, pageLayouts, display-templates) y los webparts desarrollados.

La principal diferencia entre ambas radica en el proceso de actualización de la solución, en el primer caso si vamos a realizar una modificación sobre un nuevo tipo de contenido debemos de crear una feature para volver a añadir, generar otro wsp e instalar un elemento más sobre la granja (algo que a la larga va penalizando la vida de la granja). En cambio en PowerShell no realizamos ninguna modificación en el wsp, mediante el lanzamiento de un script podemos realizar esta modificación y de esta forma no añadimos ninguna carga extra a la granja.

El motivo de que PowerShell no es solamente una herramienta para administradores de sistema, es que en visual Studio tenemos extensiones para poder utilizar PowerShell desde el propio IDE. Dentro de estas extensiones en mi opinión la que mejor funciona es Power Shell Tolls

Algunas operaciones básicas haciendo uso de PowerShell
Crear Lista

$ListName = "Aplicaciones"
    $ListDescription = "Listado de Aplicaciones"
    $SPWeb = Get-SPWeb $SiteURL
    $ListTemplate = $SPWeb.ListTemplates["Custom List"]
    if($ListTemplate -eq $null)
    {
        $ListTemplate = $SPWeb.ListTemplates["Lista personalizada"]
    }
 
    write-host "Adding list" $ListName -foregroundcolor Yellow
    $listUrl = $SPWeb.ServerRelativeUrl + "Lists/" + $ListName;
    $myCustomList = $SPWeb.Lists[$ListName]

 
Despliegue de Soluciones

Param
(    
    [Parameter(Mandatory=$false)] [string]$UrlWebApplication = "",
    [Parameter(Mandatory=$true)] [string]$Path,
    [Parameter(Mandatory=$true)] [string]$SolutionName,
    [Switch] $AllWebApplications,
    [Switch] $GACDeployment,
    [Switch] $Force,
    [Parameter(Mandatory=$false)] [string]$UrlWebApplicationFeatures = "",
    [Parameter(Mandatory=$false)] [string]$Features = ""
)
Process
{
    $snapin = Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue
    if ($snapin -eq $null) { Add-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue }

    Function Add-Solution()
    {
        Write-Host "Adding solution $SolutionName " -ForegroundColor Green -NoNewline
        Add-SPSolution $Path$SolutionName
        Write-Host "done"
        
        Write-Host "Installing solution $SolutionName " -ForegroundColor Green -NoNewline
        if(($AllWebApplications.IsPresent) -and ($GACDeployment.IsPresent)) { Write-Host "AllWebApplications and GACDeployment - " -NoNewline; Install-SPSolution -Identity $SolutionName -AllWebApplications -GACDeployment -Force -Confirm:$false }
        if(($AllWebApplications.IsPresent) -and (!$GACDeployment.IsPresent)) { Write-Host "AllWebApplications - " -NoNewline; Install-SPSolution -Identity $SolutionName -AllWebApplications -Force -Confirm:$false }
        if((!$AllWebApplications.IsPresent) -and ($GACDeployment.IsPresent) -and ($UrlWebApplication -eq "")) { Write-Host "GACDeployment - " -NoNewline; Install-SPSolution -Identity $SolutionName -GACDeployment -Force -Confirm:$false }
        if((!$AllWebApplications.IsPresent) -and (!$GACDeployment.IsPresent)-and ($UrlWebApplication -eq "")) { Install-SPSolution -Identity $SolutionName -Force -Confirm:$false }
        if((!$AllWebApplications.IsPresent) -and ($GACDeployment.IsPresent) -and ($UrlWebApplication -ne "")) { Write-Host "GACDeployment and one WebApplication - " -NoNewline; Install-SPSolution -Identity $SolutionName -GACDeployment -WebApplication $UrlWebApplication -Force -Confirm:$false }
        if((!$AllWebApplications.IsPresent) -and (!$GACDeployment.IsPresent)-and ($UrlWebApplication -ne "")) { Write-Host "One WebApplication - " -NoNewline;Install-SPSolution -Identity $SolutionName -WebApplication $UrlWebApplication -Force -Confirm:$false }
        Write-Host "done"

        if(($Features -ne "") -and ($UrlWebApplicationFeatures -ne ""))
        {
            Write-Host "Found features $Features" -ForegroundColor Green
            $Features.Split(';') | ForEach-Object {
                $Feature = $_.ToString()
                Write-Host "Enabling feature $Feature " -ForegroundColor Green -NoNewline
                Enable-SPFeature -Identity $Feature -Url $UrlWebApplicationFeatures/ -Force
                Write-Host "done"
            }
        }
        else
        {
            Write-Host "(No features to enable)" -ForegroundColor Green
        }
    }


    Write-Host "Preparing to add solution $SolutionName"
    if((Get-SPSolution | Where-Object { $_.Name -eq $SolutionName }) -ne $null)
    {
        Write-Host "Solution $SolutionName found already deployed" -ForegroundColor Green
        if($Force.IsPresent)
        {
            Write-Host "Removing solution $SolutionName " -ForegroundColor Green -NoNewline
            Remove-SPSolution -Identity $SolutionName -Force -Confirm:$false
            Write-Host "done"

            Add-Solution
        }
        else
        {
            Write-Host "Skipping"
        }
    }
    else
    {
        Add-Solution
    }

    return $true
}

Conclusión

PowerShell es una herramienta que nos ofrece multitud de posibilidades, para hacer nuestros desarrollos más escalables y sobre todo mucho más sencillo, facilitando el ciclo de vida de la propia solución. Desde ENCAMINA disponemos de un framework para agilizar nuestros desarollos propios llamado ENMARCHA que en su parte para PowerShell facilita mucho esta labor al equipo de desarrollo.

mm

Sobre Adrián Díaz

Adrián Díaz es Ingeniero Informático por la Universidad Politécnica de Valencia. Es MVP de Microsoft en la categoría Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnologías Microsoft más de 10 años y desde hace 3 años está centrado en el desarrollo sobre SharePoint. Actualmente es Software & Cloud Architect Lead en ENCAMINA.
Esta entrada ha sido publicada en powershell y etiquetada como . Enlace permanente .

Suscríbete a Desarrollando sobre SharePoint

Recibe todas las actualizaciones semanalmente de nuestro blog

You have Successfully Subscribed!