enhancement
major
minor
major
minor
Die von Vite gebauten JavaScript-Bundles der React-Module liegen versioniert im Repository, obwohl sie beim Build aus den Quellen unter react-src/ erzeugt werden:
- com.top_logic.layout.react/src/main/webapp/script/tl-react-bridge.js
- com.top_logic.layout.react/src/main/webapp/script/tl-react-controls.js
- com.top_logic.layout.react.chartjs/src/main/webapp/script/tl-react-chartjs.js
- com.top_logic.layout.react.codeedit/src/main/webapp/script/tl-code-editor.js
- com.top_logic.layout.react.wysiwyg/src/main/webapp/script/tl-react-wysiwyg.js
- com.top_logic.model.search.react/src/main/webapp/script/tl-script-editor.js
- com.top_logic.react.flow.server/src/main/webapp/script/tl-react-flow-controls.js
Jede Änderung an einer React-Komponente schreibt eine mehrere hundert Kilobyte lange minifizierte Zeile neu. Zwei Pull Requests, die dieselbe Bundle-Datei berühren, stehen deshalb immer im Konflikt, und der Konflikt ist nicht auflösbar, sondern nur durch Neubauen des Bundles zu beseitigen. Bei mehreren gleichzeitig offenen React-PRs muss nach jedem Merge jeder andere PR neu gebaut werden. Serverseitig lässt sich das nicht abfangen: Die Konfliktprüfung von Gitea kennt keine eigenen Merge-Treiber, der eingebaute union-Treiber würde zwei minifizierte Bundles zu ungültigem JavaScript verschränken.
Die Dateien wurden eingecheckt, damit ein frischer Checkout in Eclipse ohne Maven-Build lauffähig ist.
Lösung
Die sieben Bundles werden aus der Versionsverwaltung entfernt und in den .gitignore-Dateien ihrer Module eingetragen, so wie dort bereits script/top-logic.js und style/_*.css als Build-Erzeugnisse ausgenommen sind. Das Ausgabeverzeichnis src/main/webapp/script bleibt, der Build erzeugt die Bundles dort weiterhin in der Phase generate-resources (frontend-maven-plugin, npm run build); Jar und App enthalten sie wie bisher.
Für Eclipse ändert sich nichts: Das frontend-maven-plugin liefert eine m2e-Lifecycle-Zuordnung mit, nach der install-node-and-npm bei der Projektkonfiguration und die npm-Ausführungen beim Projekt-Build laufen. Ein per m2e importiertes React-Modul erzeugt sein Bundle also beim ersten Workspace-Build selbst. Wer außerhalb von Eclipse arbeitet, baut die React-Module nach einem Checkout oder Branch-Wechsel einmal mit mvn compile, was für die GWT-Module heute schon gilt.
Die Dokumentation (docs/faq/new-ui-element.md, die das Bundle als „committed“ beschreibt) wird angepasst.
Hinweise für offene Branches
Ein Branch, der eines der Bundles geändert hat, erhält beim Merge von master einen modify/delete-Konflikt auf der Datei. Er wird mit git rm <bundle> aufgelöst; danach ist der Branch konfliktfrei und das Bundle wird lokal vom Build erzeugt.
Nicht Teil dieses Tickets: tl-build_doclet/src/main/java/com/top_logic/build/doclet/javadoc.min.js ist ebenfalls ein Build-Erzeugnis (npm run minify), ändert sich aber selten und liegt außerhalb der React-Module.