Ето как го правя:
Преди да разположа актуализираната си функция, отварям функцията във 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
опреснява само съществуващи файлове. Ако сте добавили нови файлове към вашия пакет с решение, те ще бъдат игнорирани и няма да бъдат внедрени. Надявам се, че историята на версиите и възможността за надграждане на дадена функция няма да бъдат анулирани от оттегляне/разгръщане, но никога не съм го опитвал. Обикновено, ако трябва да добавя нови файлове, ще създам нов пакет решения.
person
Rich Bennema
schedule
09.07.2012