3

私たちの .sqlproj には、プロジェクトに存在するすべてのオブジェクトに対して、次のような多くのステートメントが含まれています。

<Build Include="MySchema\Tables\TableA" />
<Build Include="MySchema\Tables\TableB" />
<Build Include="MySchema\Tables\TableC" />

オブジェクトがプロジェクトに追加されるたびに、SSDT は、ファイルのランダムな行にレコードを追加して、sqlprojファイルを自動的に更新します。これにより、複数の開発者が同じプロジェクトで作業している場合、多くのマージの問題が発生します。

すべてのスキーマ フォルダーにワイルドカードを追加してこのファイルを変更しようとしたため、前のファイルは次のようになります。

<Build Include="MySchema\**" />

ただし、同じスキーマでTableDを作成すると、前のステートメントに含まれていても、そのオブジェクトのレコードが追加されます。したがって、私の .sqlproj は次のようになります。

<Build Include="MySchema\**" />
<Build Include="MySchema\Tables\TableD" />

これを回避する解決策はありますか?

4

2 に答える 2

1

Dmitrij の回答と同様に、sqlproj ファイル内の項目を並べ替える PowerShell スクリプトを次に示します。

Function AutoFix-SqlProj([string] $rootDirectory)
{
    $files = Get-ChildItem -Path $rootDirectory -Filter *.sqlproj -Recurse
    $modifiedfiles = @()

    foreach($file in $files)
    {
        $original = [xml] (Get-Content $file.FullName)
        $workingCopy = $original.Clone()

        foreach($itemGroup in $workingCopy.Project.ItemGroup){

            # Sort the Folder elements
            if ($itemGroup.Folder -ne $null){

                $sorted = $itemGroup.Folder | sort { [string]$_.Include }

                $itemGroup.RemoveAll() | Out-Null

                foreach($item in $sorted){
                    $itemGroup.AppendChild($item) | Out-Null
                }
            }

            # Sort the Build elements
            if ($itemGroup.Build -ne $null){

                $sorted = $itemGroup.Build | sort { [string]$_.Include }

                $itemGroup.RemoveAll() | Out-Null

                foreach($item in $sorted){
                    $itemGroup.AppendChild($item) | Out-Null
                }
            }
        }

        $differencesCount = (Compare-Object -ReferenceObject (Select-Xml -Xml $original -XPath "//*") -DifferenceObject (Select-Xml -Xml $workingCopy -XPath "//*")).Length

        if ($differencesCount -ne 0)
        {
            $workingCopy.Save($file.FullName) | Out-Null
            $modifiedfiles += $file.FullName
        }
    }

    return $modifiedfiles
}

$rootDirectory = Join-Path (Split-Path -Parent $MyInvocation.MyCommand.Path) "\..\..\"

$exitCode = 0;

$changedfiles = @()
$changedfiles += AutoFix-SqlProj($rootDirectory)

if ($changedfiles.Count -gt 0)
{
    Write-Host "The following files have been auto-formatted"
    Write-Host "to reduce the likelyhood of merge conflicts:"

    foreach($file in $changedfiles)
    {
        Write-Host $file
    }

    Write-Host "Your commit has been aborted. Add the modified files above"
    Write-Host "to your changes to be comitted then commit again."

    $exitCode = 1;
}

exit $exitcode
于 2020-02-07T12:53:58.480 に答える