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