SharePoint 2010手柄解决方案更新

问题描述:

假设我有一个SP2010解决方案,它可以完成许多操作:创建内容类型,实例化列表,添加事件接收器,网络,以及整个组合。现在让我们说我开发新的东西:更改一些内容类型,更改一些事件接收器等。现有的列表不会受到任何影响。这是我猜的一个给定的,但我需要应用到处的变化。你将如何处理解决方案更新很好?SharePoint 2010手柄解决方案更新

我知道SharePoint有一个升级框架(请参阅SPPersistedUpgradableObject.NeedsUpgrade),但我认为它适用于SharePoint产品本身的升级。

那该怎么办?将当前版本号存储在某个地方的一个属性包中,挂接一个功能激活的事件接收器,遍历整个世界(webapps,网站,网络,列表...)并升级所有内容?必须有一些框架来帮助我,如果没有别的,那么至少应该在某处显示进度条,因为它可能需要5分钟或更长的时间。所有想法都欢迎。

这是我如何做到这一点:

之前部署我更新的功能,我打开Visual Studio中的功能和更改版本属性(当我创建新的功能,我的版本设置为1.0.0.0)。接下来,我单击Manifest按钮,展开编辑选项部分,然后输入UpgradeActions数据。

下面是一个略加修改的版本升级后的功能:

<?xml version="1.0" encoding="utf-8" ?> 
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"> 
<UpgradeActions> 
    <VersionRange BeginVersion="1.0.0.0" EndVersion="1.1.0.0"> 
    <CustomUpgradeAction Name="UpgradeTo1v1" /> 
    </VersionRange> 
    <VersionRange BeginVersion="1.1.0.0" EndVersion="1.3.0.0"> 
    <CustomUpgradeAction Name="UpgradeTo1v3" /> 
    </VersionRange> 
    <VersionRange BeginVersion="1.3.0.0" EndVersion="1.4.0.0"> 
    <CustomUpgradeAction Name="UpgradeTo1v4"> 
    <Parameters> 
    <Parameter Name="OptionalParameter">Values go here</Parameter> 
    </Parameters> 
    </CustomUpgradeAction> 
    </VersionRange> 
</UpgradeActions> 
</Feature> 

我再添加或修改我的功能接收器的FeatureUpgrading方法:

[SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] 
public override void FeatureUpgrading(
    SPFeatureReceiverProperties properties, 
    string upgradeActionName, 
    System.Collections.Generic.IDictionary<string, string> parameters) 
{ 
    SPSite site = properties.Feature.Parent as SPSite; 
    SPWeb web = site.RootWeb; 
    switch (upgradeActionName) 
    { 
     case "UpgradeTo1v1": 
      UpgradeTo1v1(site, properties, parameters); 
      break; 
     case "UpgradeTo1v3": 
      UpgradeTo1v3(site, properties, parameters); 
      break; 
     case "UpgradeTo1v4": 
      UpgradeTo1v4(site, properties, parameters); 
      break; 
    } 
} 

我的私人升级方法作任何以编程方式进行更改,这些更新后的解决方案软件包部署时不会自动实现。我部署使用下面的PowerShell脚本解决方案包:

Write-Host "Upgrading solution: $SolutionPackageName" -NoNewline 
Update-SPSolution -Identity $SolutionPackageName -LiteralPath $SolutionPackagePath -GACDeployment -Confirm:$false -Force 
while ($Solution.JobExists) 
{ 
    Start-Sleep -s 2 
} 
Write-Host " - Done." 

if ($UpdateFeatureGuids -ne $null) 
{ 
    foreach ($site in Get-SPSite -Limit All) 
    { 
     $UpdateFeatureGuids | % { $site.QueryFeatures([Guid]$_, [bool]$true) } | % { 
      $definitionId = $_.DefinitionId 
      $parentUrl = $_.Parent.Url 
      Write-Host "Upgrading feature: $definitionId $parentUrl" 
      $_.Upgrade([bool]$false) | % { 
       if ($_ -ne $null) 
       { 
        Format-List -InputObject $_ -Property Message, InnerException -Force 
       } 
      } 
      Write-Host "Upgrading feature: $definitionId $parentUrl - Done." 
     } 
     $site.Dispose() 
    } 
} 

我真的希望Update-SPSolution了,让你升级所有的活动功能的标志。我还没有遇到需要更新功能但不希望程序升级适用的情况。因此,剩下的PowerShell代码通过遍历所有网站集,为我找到了需要根据预定义列表进行升级的所有功能,然后在显示发生的任何错误的同时升级每个网站上的功能。

请注意,Update-SPSolution只刷新现有的文件。如果您已将新文件添加到解决方案包中,则它们将被忽略并不会被部署。我希望某个功能的版本历史记录和升级能力不会因收回/部署而无效,但我从未尝试过。通常,如果我需要添加新文件,我将创建一个新的解决方案包。