SharePoint 2010处理解决方案更新

时间:2012-07-04 10:55:47

标签: sharepoint auto-update

假设我有一个SP2010解决方案可以做很多事情:创建内容类型,实例化列表,添加事件接收器,网络,整个群体。现在让我说我开发新东西:更改一些内容类型,更改一些事件接收器等。现有列表不会受到任何影响。我想这是给定的,但我需要在各处应用这些变化。您如何很好地处理解决方案更新?

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

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

1 个答案:

答案 0 :(得分:6)

我是这样做的:

在部署更新的功能之前,我在Visual Studio中打开该功能并更改版本属性(当我创建新功能时,我将版本设置为1.0.0.0)。接下来,单击Manifest按钮,展开Edit Options部分,然后输入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仅刷新现有文件。如果已将新文件添加到解决方案包中,则会忽略它们,并且不会将其部署。我希望撤消/部署不会使功能的版本历史和升级能力无效,但我从未尝试过。通常,如果我需要添加新文件,我将创建一个新的解决方案包。