====== Pipeline di build ======
Descrizione del processo di build per WvdS FPC RAD Studio.
===== Panoramica =====
┌─────────────────────────────────────────────────────────────┐
│ BUILD PIPELINE │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. PRE-BUILD │
│ ├── Controllo policy (wvds-lint) │
│ ├── Risoluzione dipendenze │
│ └── Preparazione asset │
│ │
│ 2. COMPILE │
│ ├── Invocazione pas2js / FPC │
│ ├── Risoluzione unit │
│ └── Generazione codice │
│ │
│ 3. POST-BUILD │
│ ├── Bundling asset │
│ ├── Generazione source map │
│ └── Copia in dist/ │
│ │
│ 4. PACKAGE (opzionale) │
│ ├── Creazione VSIX │
│ └── Stampa versione │
│ │
└─────────────────────────────────────────────────────────────┘
===== Pre-Build =====
==== Controllo policy ====
wvds-lint policy --path sources/
Verifica:
* P0: Nessun duplicato nelle estensioni
* P1: Nessun .ts o .js scritto a mano
* P2: Wrapper solo in common/
* P3: Output autocontenuto
==== Risoluzione dipendenze ====
Le dipendenze vengono risolte da ''build.cfg'' e ''package.json'':
# build.cfg
[build]
compiler=pas2js
entry=extension_main.pas
[dependencies]
core=../../common/core
vscode=../../common/web/vscode
===== Compile =====
==== Compilazione pas2js ====
pas2js \
-Jc \ # Output compatto
-Jirtl.js \ # RTL come modulo esterno
-Jm \ # Genera source map
-Tbrowser \ # Target: browser
-Fu../../common \ # Percorsi unit
-FE./dist \ # Directory output
pas/extension_main.pas # Entry point
==== Compilazione FPC ====
fpc \
-Mobjfpc \ # Modalita Object Pascal
-Sh \ # Ansi Strings
-O3 \ # Ottimizzazione livello 3
-Fu../../common \ # Percorsi unit
-FE./bin \ # Directory output
project.lpr # File progetto
==== Opzioni compilatore ====
^ Opzione ^ pas2js ^ FPC ^ Descrizione ^
| Debug | -Jc -Jm | -g -O0 | Simboli debug, nessuna ottimizzazione |
| Release | -Jc -O3 | -O3 -Xs | Ottimizzato, nessun simbolo |
| Profile | -Jc -Jm | -g -O2 -pg | Instrumentazione profiling |
===== Post-Build =====
==== Bundling asset ====
Le risorse vengono copiate in ''dist/'':
dist/
├── extension_main.js # Codice compilato
├── extension_main.js.map # Source map
└── assets/ # Risorse copiate
├── templates/*.html
└── images/*.png
==== Source Map ====
Le source map permettono il debug del codice Pascal:
// extension_main.js.map
{
"version": 3,
"sources": ["../pas/extension_main.pas"],
"mappings": "..."
}
===== Package =====
==== Creazione VSIX ====
vsce package --out binaries/dist/
Genera: ''wvds-vscode-{name}-{version}.vsix''
==== Stampa versione ====
La versione viene letta da ''package.json'' e incorporata nel build:
const
VERSION = {$I version.inc}; // Generato da package.json
===== Modalita build =====
^ Modalita ^ Utilizzo ^ Ottimizzazione ^ Simboli ^
| debug | Sviluppo | Nessuna | Si |
| release | Produzione | Massima | No |
| profile | Analisi performance | Media | Si + profiling |
===== Build incrementale =====
Il build usa il caching per compilazione piu veloce:
* ''binaries/cache/'' contiene le unit compilate (.ppu, .o)
* Solo le unit modificate vengono ricompilate
* ''wvds-build clean'' cancella la cache
===== CLI Toolchain =====
La toolchain di build consiste di due strumenti principali:
==== pxamlc (Compilatore PXAML) ====
Compila file PXAML per un target specifico:
pxamlc compile \
--target \
--pxaml \
--packs ~/packs \
--out ~/binaries/out//
^ Opzione ^ Descrizione ^
| ''%%--%%target'' | Piattaforma target: tui, desktop, web |
| ''%%--%%pxaml'' | File PXAML di input |
| ''%%--%%packs'' | Percorso alla registry pack |
| ''%%--%%out'' | Directory output |
==== wvds-build ====
Orchestrazione dell'intero processo di build:
wvds-build build \
--app ~/sources/applications/ \
--config ~/.wvds/wvds-build.json \
--out ~/binaries/out
^ Opzione ^ Descrizione ^
| ''%%--%%app'' | Directory applicazione |
| ''%%--%%config'' | File di configurazione |
| ''%%--%%out'' | Directory output |
=== Altri comandi ===
# Eliminare tutti gli artefatti build
wvds-build clean
# Installare pack
wvds-build pack install --from --to ~/vendor-packs --enable tui,web
# Disinstallare pack
wvds-build pack uninstall --vendor --pack
# Elencare pack installati
wvds-build pack list
==== File di configurazione ====
**Percorso:** ''~/.wvds/wvds-build.json''
{
"compilers": {
"fpc": "%LAZARUS%/fpc/3.3.1/bin/fpc.exe",
"pas2js": "%LAZARUS%/fpc/3.3.1/bin/pas2js.exe"
},
"paths": {
"packs": "~/packs",
"common": "~/sources/common",
"output": "~/binaries/out"
},
"defaults": {
"target": "web",
"mode": "debug"
},
"targets": {
"tui": {
"compiler": "fpc",
"enabled": true
},
"desktop": {
"compiler": "fpc",
"enabled": true
},
"web": {
"compiler": "pas2js",
"enabled": true
}
}
}
==== Task VS Code ====
I task vengono generati automaticamente:
// .vscode/tasks.json (generato)
{
"version": "2.0.0",
"tasks": [
{
"label": "WVDS: Build TUI",
"type": "shell",
"command": "${workspaceFolder}/.wvds/bin/wvds-build",
"args": ["build", "tui"]
},
{
"label": "WVDS: Build Desktop",
"type": "shell",
"command": "${workspaceFolder}/.wvds/bin/wvds-build",
"args": ["build", "desktop"]
},
{
"label": "WVDS: Build Web",
"type": "shell",
"command": "${workspaceFolder}/.wvds/bin/wvds-build",
"args": ["build", "web"]
}
]
}
Non modificare manualmente i task - vengono generati da ''wvds-build''.
===== Integrazione CI/CD =====
# .github/workflows/build.yml
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install FPC
run: sudo apt-get install fpc
- name: Install pas2js
run: sudo apt-get install pas2js
- name: Build
run: wvds-build --mode release
- name: Package
run: wvds-build package
===== Risoluzione problemi =====
==== "Unit not found" ====
* Verificare percorsi unit in build.cfg
* Verificare maiuscole/minuscole (Linux)
==== "JavaScript error" ====
* Usare source map per debugging
* Verificare warning nell'output pas2js
==== "VSIX invalid" ====
* Validare package.json
* README.md deve esistere
* Verificare percorso icona
===== Vedi anche =====
* [[.:targets|Target di build]]
* [[.:release|Processo di release]]
* [[.:testing|Testing]]