Обновление решения обработки SharePoint 2010

Допустим, у меня есть решение SP2010, которое выполняет множество функций: создает типы контента, создает списки, добавляет приемники событий, веб-сайты и все такое. Теперь предположим, что я разрабатываю что-то новое: меняю некоторые типы контента, меняю некоторые приемники событий и т. Д. Ни один из них не повлияет на существующие списки. Думаю, это данность, но мне нужно применить изменения везде. Как бы вы хорошо справились с обновлением решения?

Я знаю, что в SharePoint есть структура обновления (см. SPPersistedUpgradableObject.NeedsUpgrade), но я думаю, что она применима к обновлениям самого продукта SharePoint.

Так что делать? Сохраните где-нибудь текущий номер версии в сумке свойств, подключите активированный приемник событий, выполните рекурсию по всему миру (веб-приложения, сайты, веб-сайты, списки ...) и обновите все? Должна быть какая-то структура, которая поможет мне в этом, если ничего больше, то, по крайней мере, где-то должен быть показан индикатор выполнения, потому что это может занять около 5 минут или больше. Все идеи приветствуются.


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


Ответы (1)


Вот как я это делаю:

Перед развертыванием обновленной функции я открываю ее в 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