2

コンテンツ タイプの作成、リストのインスタンス化、イベント レシーバーの追加、Web など、多くのことを行う SP2010 ソリューションがあるとします。ここで、新しいものを開発するとしましょう: いくつかのコンテンツ タイプを変更し、いくつかのイベント レシーバーを変更するなどです。既存のリストはそれらのいずれにも影響されません。当然のことだと思いますが、どこにでも変更を適用する必要があります。ソリューションの更新を適切に処理するにはどうすればよいですか?

SharePoint にアップグレード フレームワークがあることは知っていますが (SPPersistedUpgradableObject.NeedsUpgrade を参照)、SharePoint 製品自体のアップグレードにも当てはまると思います。

じゃあ何をすればいいの?現在のバージョン番号をプロパティ バッグのどこかに保存し、機能をアクティブ化するイベント レシーバーを接続し、全世界 (Web アプリケーション、サイト、Web、リストなど) を再帰してすべてをアップグレードしますか? これを支援するためのフレームワークが必要です.5分以上かかる可能性があるため、少なくともプログレスバーをどこかに表示する必要があります. すべてのアイデアを歓迎します。

4

1 に答える 1

6

これが私がそれを行う方法です:

更新した機能を展開する前に、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既存のファイルのみを更新することに注意してください。ソリューション パッケージに新しいファイルを追加した場合、それらは無視され、展開されません。機能のバージョン履歴とアップグレード機能がリトラクト/デプロイによって無効にされないことを願っていますが、試したことはありません。通常、新しいファイルを追加する必要がある場合は、新しいソリューション パッケージを作成します。

于 2012-07-09T20:26:20.570 に答える