Вот как я это делаю:
Перед развертыванием обновленной функции я открываю ее в Visual Studio и меняю свойство Version (при создании новых функций я устанавливаю версию 1.0.0.0). Затем я нажимаю кнопку «Манифест», раскрываю раздел «Параметры редактирования» и ввожу данные 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
обновляет только существующие файлы. Если вы добавили новые файлы в пакет решения, они будут проигнорированы и не будут развернуты. Я надеюсь, что история версий и возможность обновления функции не будут аннулированы при отзыве / развертывании, но я никогда не пробовал этого. Обычно, если мне нужно добавить новые файлы, я создаю новый пакет решения.
person
Rich Bennema
schedule
09.07.2012