SharePoint 2010 управлява актуализацията на решението

Да кажем, че имам решение SP2010, което прави много неща: създаване на типове съдържание, инстанциране на списъци, добавяне на приемници на събития, мрежи, цялата група. Сега да кажем, че разработвам нови неща: променям някои типове съдържание, променям някои приемници на събития и т.н. Съществуващите списъци няма да бъдат засегнати от нито едно от тях. Това е даденост, предполагам, но трябва да приложа промените навсякъде. Как бихте се справили добре с актуализирането на решението?

Знам, че SharePoint има рамка за надграждане (вижте SPPersistedUpgradableObject.NeedsUpgrade), но мисля, че се отнася за надстройки на самия продукт на SharePoint.

И така, какво да правя? Да съхранявате номера на текущата версия в чанта със свойства някъде, да свържете приемник на събития с активирана функция, да рекурсирате през целия свят (уеб приложения, сайтове, мрежи, списъци...) и да надстроите всичко? Трябва да има някаква рамка, която да ми помогне с това, ако не друго, то поне лента за напредък трябва да се показва някъде, защото може да отнеме около 5 минути или повече. Всички идеи са добре дошли.


person fejesjoco    schedule 04.07.2012    source източник


Отговори (1)


Ето как го правя:

Преди да разположа актуализираната си функция, отварям функцията във 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