none
Powershell Dacpac Version beim Build setzen

    Frage

  • Hallo Zusammen,

    ich probiere gerade beim Build Automatisch die Version für eine Dacpac Datei zusetzen.
    Das auslesen des Knoten aus der *.sqlproj funktioniert. Das setzen der neuen Versionsnummer nicht.

    Jemand eine Ahnung voran es liegen kann.

    Hier der Code:

    [xml]$fileContent = Get-Content($file)
    		Write-Host  $fileContent.DocumentElement
    		[string]$oldVersion = $fileContent.Project.PropertyGroup.DacVersion
    
    		[string]$newVersion = $oldVersion -replace $versionPattern , $replacePattern
    		
    		Write-Host "Pattern $replacePattern"
    		Write-Host "Alte Version $oldVersion"
    		Write-Host "Neue Version $newVersion"
    
    
                   Write-Host $fileContent.Project.PropertyGroup.DacVersion
    				   $fileContent.Project.PropertyGroup.DacVersion = $newVersion //Hier kommt der Fehler
    		Write-Host $fileContent.Project.PropertyGroup.DacVersion
    		$fileContent.Save($file)
    
    		Write-Host "$file Version geändert."


    Und hier die Ausgabe:

    Pattern $1.$2.$3.2379
    Alte Version 1.0.0.1   
    Neue Version 1.0.0.2379   
    
    1.0.0.1
    
    [error]Die Eigenschaft "DacVersion" wurde für dieses Objekt nicht 
    gefunden. Vergewissern Sie sich, dass die Eigenschaft vorhanden ist und 
    festgelegt werden kann.
    
    In E:\Agent\_work\4\s\SetDatabaseVersion.ps1:33 Zeichen:8
    
    $fileContent.Project.PropertyGroup.DacVersion = [string]$newVersion
    
    [error]    + FullyQualifiedErrorId : PropertyAssignmentException
    
    [error]1.0.0.1

    Der Knoten sieht wie folgt aus.

    <Project ....>
    <PropertyGroup> 
    <DacVersion>1.0.0.1</DacVersion>
    </PropertyGroup>
    </Project>

    Freitag, 29. Juli 2016 08:43

Alle Antworten

  • Hi,

    das XML-Element DacVersion liegt im XML-Namespace "http://schemas.microsoft.com/developer/msbuild/2003" (vgl. Project-Element) Bei den Abfragen nach bestimmten Elementen muss daher dieser Namespace beachtet/angegeben werden.

    Da der obige Namespace der Default-Namespace ist, kannst Du den Wert aus dem DacPacVersion Element auch ohne Namespace Angabe mit der vereinfachten DOT-Notation auslesen. Allerdings scheint die Powershell dies nur bei lesendem Zugriff hinzubekommen, aber nicht wenn man Werte im XML mit dieser Methode ändern möchte.

    Wie man Namespaces in der Dot-Notation berücksichtigt, weiß ich leider nicht. Aber über den klassischen Zugriff mittels SelectSingleNode und einem XPath Ausdruck funktioniert es, wie folgt:

    [xml]$fileContent = Get-Content($file)
    
    $nsm = New-Object Xml.XmlNamespaceManager($fileContent.NameTable)
    $nsm.AddNamespace("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003")
    
    ..
    $dacPacVersionNode = $fileContent.SelectSingleNode("/msbuild:Project/msbuild:PropertyGroup/msbuild:DacVersion", $nsm)
    
    ..
    $oldVersion = $dacPacVersionNode.InnerText
    $newVersion = ...
    
    
    $dacPacVersionNode.InnerText = $newVersion
    ..
    
    $fileContent.Save(..)


    • Als Antwort vorgeschlagen --Stefan-- Donnerstag, 28. September 2017 07:10
    Mittwoch, 30. August 2017 10:09