AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML bearbeiten im VBScript (FinalBuilder)
Thema durchsuchen
Ansicht
Themen-Optionen

XML bearbeiten im VBScript (FinalBuilder)

Ein Thema von himitsu · begonnen am 1. Aug 2023 · letzter Beitrag vom 6. Okt 2023
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#1

XML bearbeiten im VBScript (FinalBuilder)

  Alt 1. Aug 2023, 11:31
[edit]
OK, ich komm um manuelles Speichern nicht drumrum, bei all dem Scheiß, den Emba da baut.

* Emba speichert mit UTF-8 BOM, MS-XMLDOM ohne BOM
* Emba speichert als HTML-Entity, MS-XMLDOM als "
* Emba speichert alles mit CRLF, Emba auch, außer die Zeilenumbrüche innerhalb dieses Nicht-CDATA-PostBuildEvent, welche als CR (nicht LF) gespeichert sind

Aber eine Lösung, wie die " unverändert blieben und nicht zu " würden, wäre dennoch toll.
[/edit]


Moin,

also genauer geht es um DPROJs.


Für Delphi XE hatte ich noch mit String-Replace rumgepfuscht,
aber für 11.x wollte ich das nun "richiger" machen.

Die 4 Leerzeichen, welche Microsoft.XMLDOM als Tab speichert, konnte ich nun doch lösen.
preserveWhiteSpace=True vor dem SAVE (nicht nur/schon vor dem Load)

Aber nun noch noch der nächste Schrott, den Delphi verbockt.

in der BASE heißt es noch <PostBuildEvent><![CDATA["... aber dann, obwohl es sich "eigentlich" nicht ändert, wird nochmal für jede Config ein <PostBuildEvent>&quot;... gespeichert.


OK, abgesehn davon, dass man nun sinnlos redundanten Dreck in der DPROJ hat (wunderschön für einen GIT-Diff),
speichert XMLDOM das &quot; als " ab.

Im Node.Text ein Replace von " zu &quot; würde natürlich &amp;quot; ergeben.

Gibt es da nun irgendeinen Weg dem XML-DOM beizubringen das nicht zu ändern, bzw. die " in Node-Texten als &quot; zu speichern? (außer im CDATA)
* der Code an sich funktioniert dennoch
* ich könnte diese Nodes auch einfach löschen und es wäre alles OK
* oder ich muß doch wieder nachträglich in der Datei Replacen
-> die ersten Beiden würden gehen, aber ergeben "beschissene" Änderungen im GIT-Diff, die dann später durch Delphi nochmals geändert wurden (ein krankes hin und her, mit nervigen Änderungen im Commit)


Also ein billiges StringReplace über den kompletten XML-Text .... nja, die meißten " müssen ja " bleiben.
Die kompletten Nodes Replacen, da müsste man aufpassen, wenn zukünftig dort etwas geändert würde-







Diesen PostBuildEvent-Bug gibt es nun schon ewig ... glaub nicht dass Emba das zeitnah repariert bekommt.

Code:
' in der Projektdatei die entsprechende Default-Config aktivieren (Release, Debug oder DebugOhneEurekalog)
function UpdateDefaultConfigInProjectFile(Action)
  File  = ExpandVarQuiet(Action.BuildFile)
  Config = FBVariables.MAKE_CONFIG

  set XML = CreateObject("Microsoft.XMLDOM")
  XML.preserveWhiteSpace = True
  XML.async = False
  if not XML.load(File) then call Err.Raise(1, "FinalBuilder", File + " not loaded : " + CStr(XML.parseError.errorCode) + " " + CStr(XML.parseError.reason))

  set Node = XML.selectSingleNode("//ItemGroup/BuildConfiguration[@Include='" + Config + "']")
  if Node is Nothing then
    Action.Echo "does NOT found Config '" + Config + "' in " + File
  else
    Action.Echo "found Config '" + Config + "' in " + File

    set Node = XML.selectSingleNode("//PropertyGroup/Config")
    Node.text = Config

    XML.preserveWhiteSpace = True
    if XML.save(File) <> 0 then call Err.Raise(1, "FinalBuilder", "write error")
  end if
end function
Ja, beim MSBuild kann ich via Parameter die zu verwendende Config übergeben, aber es soll dann auch im Delphi die entsprechende Config "standardmäßig" aktiv sein, beim Debuggen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Aug 2023 um 15:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#2

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 2. Aug 2023, 13:28
Wie Uwe es bei seinem Project Magician wohl macht, dass die DPROJ dabei nicht kaputt geht?

effektiv geht es hier ja auf das hinaus
https://learn.microsoft.com/en-us/pr...57828(v=vs.85)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 2. Aug 2023, 14:24
Wie Uwe es bei seinem Project Magician wohl macht, dass die DPROJ dabei nicht kaputt geht?
Ehrlich gesagt, weiß ich gar nicht, ob sie dabei nicht doch kaputt geht. Aber falls es relevant ist: Ich verwende NativeXML zur Bearbeitung.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#4

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 2. Aug 2023, 18:17
OK, vermutete du hattest da vielleicht selber schon damit gekämpft und entsprechend eine Lösung gefunden.


aktuell sieht es nun so aus
Code:
' in der Projektdatei die entsprechende Default-Config aktivieren (Release, Debug oder DebugOhneEurekalog)
function UpdateDefaultConfigInProjectFile(Action)
  File  = ExpandVarQuiet(Action.BuildFile)
  Config = FBVariables.MAKE_CONFIG

  set XML = CreateObject("Microsoft.XMLDOM")
  XML.preserveWhiteSpace = True
  XML.async = False
  if not XML.load(File) then call Err.Raise(1, "FinalBuilder", File + " not loaded : " + CStr(XML.parseError.errorCode) + " " + CStr(XML.parseError.reason))

  set Node = XML.selectSingleNode("//ItemGroup/BuildConfiguration[@Include='" + Config + "']")
  if Node is Nothing then
    Action.Echo "does NOT found Config '" + Config + "' in " + File
  else
    Action.Echo "found Config '" + Config + "' in " + File

    set Node = XML.selectSingleNode("//PropertyGroup/Config")
    if Node.text <> Config then
      Node.text = Config

      XML.preserveWhiteSpace = True ' sonst wird aus 4-Leerzeichen ein Tab, bei der Einrückung
      'if XML.save(File) <> 0 then call Err.Raise(1, "FinalBuilder", "write error")
      Text = XML.xml

      ' aus nachfolgenden <PostBuildEvent>&quot;$(root)\... wurde <PostBuildEvent>"$(root)\...
      ' im ersten <PostBuildEvent><![CDATA["$(root)\... ist und bleibt alles OK
      ' es funktioniert zwar dennoch, aber im GIT-Diff/Commit wäre es blöde
      Line = "<PostBuildEvent>&quot;$(root)\Build\dproj__compile_postbuild.cmd&quot; &quot;$(Config)&quot; &quot;$(Platform)&quot; &quot;$(OutputExt)&quot; &quot;$(InputDir)$(InputName)&quot; &quot;$(OutputDir)$(OutputName)&quot;"
      Text = Replace(Text, Replace(Line, "&quot;", """"), Line)
      Line = "<Debugger_Launcher>/usr/bin/xterm -e &quot;%debuggee%&quot;</Debugger_Launcher>"
      Text = Replace(Text, Replace(Line, "&quot;", """"), Line)

      ' innerhalb der Nicht-CDATA-PostBuildEvent wird vom Delphi nur CR gespeichert (nicht LF), aber überall sonst als CRLF
      Text = Replace(Text, vbCrLf + "</PostBuildEvent>", vbCr + "</PostBuildEvent>")

      ' Außerdem speichert Delphi inkl. UTF-8 BOM, aber XML.save tut das nicht
      set fh = CreateObject("ADODB.Stream")
      fh.Charset = "UTF-8"
      fh.Open
      fh.WriteText Text
      fh.SaveToFile File, 2   ' 2=adSaveCreateOverWrite
      fh.Close
    end if
  end if
end function
bzw. im alten XE-Script
Code:
    ' XE hatte alles um einen Tab eingerückt und eine Leerzeile am Ende ... also das für GIT nun wieder rein
    Text = vbTab + Replace(Text, vbLf, vbLf + vbTab)
    if Right(Text, 1) = vbTab then Text = Left(Text, Len(Text) - 1) ' Trim/RTrim entfernt keine Tabs/Zeilenumbrüche



Wobei ich ja eigentlich "nur" das machen wollte
Code:
' in der Projektdatei die entsprechende Default-Config aktivieren (Release, Debug oder DebugOhneEurekalog)
function UpdateDefaultConfigInProjectFile(Action)
  File  = ExpandVar(Action.BuildFile)
  Config = FBVariables.MAKE_CONFIG

  set XML = CreateObject("Microsoft.XMLDOM")
  if not XML.load(File) then call Err.Raise(1, "FinalBuilder", File + " not loaded : " + CStr(XML.parseError.errorCode) + " " + CStr(XML.parseError.reason))

  set Node = XML.selectSingleNode("//ItemGroup/BuildConfiguration[@Include='" + Config + "']")
  if Node is Nothing then
    Action.Echo "does NOT found Config '" + Config + "' in " + File
  else
    Action.Echo "found Config '" + Config + "' in " + File

    set Node = XML.selectSingleNode("//PropertyGroup/Config")
    if Node.text <> Config then
      Node.text = Config

      if XML.save(File) <> 0 then call Err.Raise(1, "FinalBuilder", "write error")
    end if
  end if
end function
Aber damit sich FinalBuilder, Delphi und Git nicht streiten und dann "Änderungen" zeigen, welche es garnicht gibt, bzw. es nicht sinnlos gegenseitig hin-&herkonvertieren ...........
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#5

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 3. Aug 2023, 11:35
Zitat:
NativeXML
Hmmm, so im Groben und Ganzen scheint das gleicht zu arbeiten,

ist aber im VBScript aber so wohl nicht nutzbar.

Bliebe nur noch die Frage, ob man MSXML gleich arbeiten lassen kann.




ProjectMagicianCmd mit -n , -r , -x , -f , -d und -uwp ausgerufen
und dann das Projekt nochmal in 11.3 geöffnet und neu gespeichert.

Danach ist vom -r das Linux und Android aber wieder drin.

Zusätzlich noch TargetedPlatforms=1 und aus <Platforms> gelöscht, bleiben die dann auch weg.

Hatte mich eh schon immer etwas genervt (schonmal per Hand gelöscht hatte), weil ist ja ein VCL-Programm <FrameworkType>VCL</FrameworkType> und unterstützt das eh nicht.
Code:
        <TargetedPlatforms>3</TargetedPlatforms>
...
            <Platforms>
                <Platform value="Android">False</Platform>
                <Platform value="Android64">False</Platform>
                <Platform value="Linux64">False</Platform>
                <Platform value="Win32">True</Platform>
                <Platform value="Win64">True</Platform>
            </Platforms>

Sooooooooooo ... BOM ist vorhanden, auch die &quot; bleiben, nur beim PostBuildEvent ist etwas nicht ganz in Ordnung (für GIT, aber die Funktion geht) und Delphi ändert es wieder zurück.

Original
Code:
        <PostBuildEvent><![CDATA["xxxx.cmd" params
$(PostBuildEvent)]]></PostBuildEvent>
ProjectMagician
Code:
        <PostBuildEvent>
            <![CDATA["xxxx.cmd" params
$(PostBuildEvent)]]>
        </PostBuildEvent>


[add]
Ohhh, man kann auch alle Parameter gemeinsam nutzen.
Die Hilfe laß sich so, als ginge es nur einzeln.
(hatte es dennoch grade mal so probiert)
ProjectMagicianCmd [-v:<version> | -n | -r | -x | -f | -d | -uwp] [<filepath>]<filename> [-l:<logfile>] [-s]
anstatt
ProjectMagicianCmd [-v:<version>] [-n] [-r] [-x] [-f] [-d] [-uwp] [<filepath>]<filename> [-l:<logfile>] [-s]

Im IDE-Package gibt es ein "Clean Line Feads".
Wie gesagt, da muß du etwas aufpassen, da teilweise wirklich CR statt CRLF vorkommen. (genauso, wie ein RichEdit ja intern #13 als LineFead benutzt und die Delphi-Komponente das nur bruchteilhaft im VCL-TRichEdit konvertiert)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 3. Aug 2023 um 11:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 3. Aug 2023, 12:10
Im IDE-Package gibt es ein "Clean Line Feads".
Wie gesagt, da muß du etwas aufpassen, da teilweise wirklich CR statt CRLF vorkommen. (genauso, wie ein RichEdit ja intern #13 als LineFead benutzt und die Delphi-Komponente das nur bruchteilhaft im VCL-TRichEdit konvertiert)
Das betrifft aber nur pas- und dpr/dpk-Dateien beim Öffnen in der IDE. Ist in Delphi 11 ja eh schon eingebaut.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 3. Aug 2023, 12:14
nur beim PostBuildEvent ist etwas nicht ganz in Ordnung (für GIT, aber die Funktion geht) und Delphi ändert es wieder zurück.

Original
Code:
        <PostBuildEvent><![CDATA["xxxx.cmd" params
$(PostBuildEvent)]]></PostBuildEvent>
ProjectMagician
Code:
        <PostBuildEvent>
            <![CDATA["xxxx.cmd" params
$(PostBuildEvent)]]>
        </PostBuildEvent>
Ja, das ist bekannt und wird von NativeXML so umgesetzt. Da es faktisch nicht relevant ist und bisher auch nur selten benutzt wurde habe ich das erstmal dabei belassen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#8

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 3. Aug 2023, 13:41
Zitat:
LineFeed
Ahhh, OK.


Ja, funktional stimmt es ja, da die Daten im CDATA nicht geändert werden.
Ist halt nur bissl blöd unpraktisch in einer Versionierung, wenn sich das Tool und die IDE gegenseitig bekämpfen.


OK, nervend ist es auch, wenn die IDE manchmal bei jedem Speichern die DPROJ bissl umsortiert.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 3. Aug 2023, 14:17
OK, nervend ist es auch, wenn die IDE manchmal bei jedem Speichern die DPROJ bissl umsortiert.
Gerade das sollte der Project Magician aber abfangen. Wenn nicht, hätte ich gern einen TestCase...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#10

AW: XML bearbeiten im VBScript (FinalBuilder)

  Alt 3. Aug 2023, 14:22
Ja, beim Delphi ohne Magican.

Aktuell hab ich keinen Fall, aber im 10.4 und 11.2 hatte ich das paar mal gehabt.



Hatte schomal Emba wer gefragt, warum die nichts sortieren?
Wäre zu praktisch, sie würden eine XLST erstellen, selber nutzen und sie auch teilen.


Und meinen anderen Wunsch, wo ich seit Tagen vor hatte den mal ins QC zu stellen.
-> warum die Configs cfg_<nr> heißen und nicht so wie die Config, vor allem da es schon mehrmals vorgekommen ist, dass z.B. Debug=Cfg_1 und Release=Cfg_2 aber dann auch mal Debug=Cfg_2 und Release=Cfg_1 ... wie soll man da diesen Mist "lesen" können?



Außerdem wird es mal Zeit, dass die ihre abgeleitete Config ordentlich hinbekommen. (schon seit Anfang bis jetzt)
Wie zu Beginn genannt, das <PostBuildEvent> einmal mit CDATA in der Base (oder wo man was in den Projektoptionen einstellt)
und dann nach den <Import Project=....> nochmal viele Ableitungen ohne CDATA, die aber eigentlich unverändert sind und somit garnicht gespeichert werden sollten.
Code:
    <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
    <PropertyGroup Condition="'$(Config)'=='Debug' And '$(Platform)'=='Win32'">
        <PreBuildEvent/>
        <PreBuildEventIgnoreExitCode>False</PreBuildEventIgnoreExitCode>
        <PreLinkEvent/>
        <PreLinkEventIgnoreExitCode>False</PreLinkEventIgnoreExitCode>
        <PostBuildEvent>&quot;....&quot;
</PostBuildEvent>
        <PostBuildEventIgnoreExitCode>False</PostBuildEventIgnoreExitCode>
    </PropertyGroup>
    ....


PS: Räumt dein Magican auch die <Import> auf?
Beim Upgrade von Projekten tut Delphi diesen Teil leider nicht aktualisieren.
Im Inline-Compiler kompiliert fällt es nicht auf, da Delphi eh das halbe MSBuildScript ignoriert und es wirklich nur als ConfigsSpeicher benutzt.
Aber im MSBuild, oder wenn in den Projektoptionen "mit extern Kompilieren" aktiv ist, dann raucht MSBuild ab, bzw. es fehlt die Hälfte vom Delphi-Zeugs, weil's ja nicht importiert wird.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 3. Aug 2023 um 14:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz