Laden...

[Gelöst] Powershell Dacpac Version beim Build setzen

Erstellt von Palin vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.477 Views
P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 7 Jahren
[Gelöst] Powershell Dacpac Version beim Build setzen

Hallo Zusammen,

ich probiere gerade beim Build Automatisch die Version für eine Dacpac Datei zusetzen.
Das auslesen des Konaten 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:

Fehlermeldung:
Pattern $1.$2.$3.2379
Alte Version 1.0.0.1
Neue Version 1.0.0.2379

1.0.0.1

Fehlermeldung:
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> Fehlermeldung:
+ FullyQualifiedErrorId : PropertyAssignmentException> Fehlermeldung:

1.0.0.1

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.807 Beiträge seit 2008
vor 7 Jahren

$fileContent.Project.PropertyGroup hat keine Eigenschaft mit dem Namen DacVersion
Das sagt der Fehler aus.

Wieso nimmst Du nicht aus PowerShell heraus die .NET Funktionalitäten?

4.931 Beiträge seit 2008
vor 7 Jahren

Fehlermeldung:
... und festgelegt werden kann.

Anscheinend gibt es keinen Setter für diese Eigenschaft.

@Abt: das Lesen scheint ja zu funktionieren.

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 7 Jahren

@abt In der Zeile davor kann ich aber auf die Eigenschaft zugreifen und bekomme auch den Richtigen Wert zurück.

Nun das hier waren grundlegend die ersten Ergebnisse die ich bei Googel zu "Powershell XML Update" gefunden habe. Und der Zugriff so ist je eigentlich recht simpel. Wenn er nur Funktionieren würde 🙁

@Th69 Da geht auch meine Vermutung hin. Mir ist nur nicht klar wie ich es ändern kann, es ist der Wert eines Kontens in einem XML Document. Eigentlich sollte es mit dem Schreiben klappen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.807 Beiträge seit 2008
vor 7 Jahren

Ah, jetzt seh ichs auch 😉

Vermutlich wirst Du mit DacVersion.Value oder DacVersion.'#text' arbeiten müssen.

$fileContent.Project.PropertyGroup.DacVersion.'#text' = "$newVersion"

DacVersion ist - so wie ich das sehe - eine XmlNode. Dass Du [string] verwenden kannst liegt am impliziten ToString, das da vermutlich ausgeführt wird, das Dir die Value zurück gibt.

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 7 Jahren

Mit Value hatte ich es schon probiert. Mit Text Probiere ich es mal Morgen auf der Arbeit.

Danke schon mal für die Antwort.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 7 Jahren

Mit '#text"' hat es jetzt auch nicht Funktioniert.

Hier noch mal ein Link von dem ich das eigentliche Vorgehen habe.
Powershell functions to get an xml node, and get and set an xml element’s value, even when the element does not already exist

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

5.657 Beiträge seit 2006
vor 7 Jahren

Hi Palin,

Hier noch mal ein Link von dem ich das eigentliche Vorgehen habe.

Dort steht aber auch:

...until you try and read or write to an element that doesn’t exist. If the <version> element is not in the xml, when I try and read from it or write to it, I get an error such as “Error: Property ‘version’ cannot be found on this object. Make sure that it exists.”.

Und es wird die Lösung vorgeschlagen, die Abt auch schon vorgeschlagen hat, nämlich auf die .NET-Klassen im System.Xml-Namespace zurückzugreifen.

Hast du das schon ausprobiert?

Weeks of programming can save you hours of planning

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 7 Jahren

until you try and read or write to an element that doesn’t exist

Das Element Existiert ja, sonst könnte ich ja auch nicht lesend darauf zugreifen. Das mit der .NET-Klasse ist ein "Workaround" um die Exception zu umgehen.

Mit den .NET-Klassen hab ich es jetzt noch nicht Probiert.

Aktuell hab ich ein Tokenizer PlugIn für den TFS gefunden, was eigentlich genau das machen sollte. Mal schauen ob das Funktioniert.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

A
1 Beiträge seit 2016
vor 7 Jahren

Der Zugriff ist eigentlich relativ simpel.

Nachdem in der XML-Struktur das Element "PropertyGroup" öfters vorkommt (default, debug, release), musst du hier nur das richtige Element selektieren.


$path = "C:\temp\aaa.sqlproj"
$content=[xml](Get-Content $path)
$propGroup = $content.Project.PropertyGroup[0]
$propGroup.DacVersion = "123"
#fertig

Die Ermittlung der richtigen PropertyGroup musst du halt noch sauber machen, aber grundlegend funktionierts so 😃 .

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 7 Jahren

@alta Danke für die Antwort. 👍

Eine Kollege hat mitlerweile an andere Lösung gefunden. (Poste ich hier noch). Dein Werde ich bei gelegenheit mal ausprobieren.

MFG
Palin

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

P
Palin Themenstarter:in
1.090 Beiträge seit 2011
vor 7 Jahren

Hier die Lösung.

Das Skript aus dem Beitrag
Versioning your SQL Server Database using Team Build and Release Management funktioniert bei uns.

Es fehlt nur die Funktion Set-XmlElementsTextValue die ist in diesen Beitrag zu finden.

Powershell functions to get an xml node, and get and set an xml element’s value, even when the element does not already exist

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern