这是我的做法:
在部署更新的功能之前,我在 Visual Studio 中打开该功能并更改 Version 属性(当我创建新功能时,我将版本设置为 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
仅刷新现有文件。如果您已将新文件添加到解决方案包,它们将被忽略并且不会被部署。我希望功能的版本历史和升级能力不会因撤回/部署而无效,但我从未尝试过。通常,如果我需要添加新文件,我会创建一个新的解决方案包。