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