假设我有一个SP2010解决方案可以做很多事情:创建内容类型,实例化列表,添加事件接收器,网络,整个群体。现在让我说我开发新东西:更改一些内容类型,更改一些事件接收器等。现有列表不会受到任何影响。我想这是给定的,但我需要在各处应用这些变化。您如何很好地处理解决方案更新?
我知道SharePoint有一个升级框架(请参阅SPPersistedUpgradableObject.NeedsUpgrade),但我认为它适用于SharePoint产品本身的升级。
那该怎么办?将当前版本号存储在某处的属性包中,连接一个功能激活的事件接收器,整个世界(webapps,网站,网站,列表......)并升级所有内容?必须有一些框架来帮助我,如果没有其他的话,那么至少应该在某处显示进度条,因为它可能需要5分钟或更长时间。欢迎所有想法。
答案 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
仅刷新现有文件。如果已将新文件添加到解决方案包中,则会忽略它们,并且不会将其部署。我希望撤消/部署不会使功能的版本历史和升级能力无效,但我从未尝试过。通常,如果我需要添加新文件,我将创建一个新的解决方案包。