Celý build stack pruga začíná v editoru a končí spuštěným programem. Žádná složitá logika se v projektech neopakuje — veškerá je schovaná ve fish funkcích pluginu pruga (repozitář barbaros@pruga-fish.domogled.com). Soubor play.fish a make.fish v každém projektu je jen tenká slupka kolem funkce pruga-run.
Editor je nastaven tak, že stisk klávesy
ctrl+shift+s spustí pruga play — zpracuje právě upravovaný soubor,ctrl+shift+c spustí pruga make — sestaví celý projekt.Nejdřív se uloží právě upravovaný soubor a pak se v terminálu spustí skript. Jak píšu v článku Postavte si vlastní lehké IDE z textového editoru a shellu (Root.cz, 10. 4. 2024):
Editor musí umět spustit příkaz v terminálu. Tímto úplně jednoduchým trikem lze z editoru vytvořit všehoschopné IDE. Nepřeháním.
pruga Pro Visual Studio Code existuje rozšíření Ⱂⱃⱆⰳⰰ (Pruga) vscode extension (pruga-vscode, vydavatel barbaros-pruga), které dělá přesně tohle — vlastními slovy rozšíření:
Run script on save file. That is the simplest building system.
pruga.play a pruga.make pruga.play(výchozí ./play.fish) a pruga.make (výchozí ./make.fish) — příkaz, který se spustí nad souborem / nad projektemctrl+shift+s → pruga play,ctrl+shift+c → pruga make (na macu cmd+shift+s / cmd+shift+c)Rozšíření je napsané v jazyce Nim (transpilací do JavaScriptu), ne v TypeScriptu — viz citace z článku:
Ačkoliv se rozšíření pro VS Code běžně píší v jazyce TypeScript, zjistil, že to lze psát i v mém oblíbeném jazyce Nim, který se také umí transpilovat do JavaScriptu … proto jsem rozšíření napsal v něm.
Stejného cíle se dá dosáhnout v každém editoru, který umí spustit příkaz v terminálu — viz článek:
Ve vývojovém prostředí, jak ho zde popíšu, můžete použít téměř libovolný textový editor, nebo i komplexní IDE. Mám pouze jeden jediný poněkud neobvyklý požadavek. Editor musí umět spustit příkaz v terminálu.
Např. v Geany je to položka build menu:
pruga play ./play.fish "%f" %p/master
pruga make ./make.fish "%f" %p/master
pruga-play a pruga-make jsou fish funkce nainstalované pluginem pruga (fisher). Nedělají nic jiného, než že najdou a spustí soubor play.fish, resp. make.fish, v aktuálním nebo nadřazeném adresáři.
pruga-play /pruga-make — najdou play.fish / make.fish Obě funkce volají sdílenou funkci pruga-find-and-run-script:
function pruga-play --description "Najde a spustí play.fish v aktuálním nebo nadřazeném adresáři"
set start_time (date +%s%N)
pruga-find-and-run-script play.fish $argv
# ... měření času a výpis
end
function pruga-make --description "Najde a spustí make.fish v aktuálním nebo nadřazeném adresáři"
pruga-find-and-run-script make.fish $argv
end
.track a .trunk Než se play.fish/make.fish vůbec spustí, načte pruga-find-and-run-script nastavení prostředí. Nejprve ../.trunk (nastavení celého trunku), pak .track (nastavení dané větve):
# nejdříve načteme nastavení environment,
# aby bylo nastavení dostupné i ve skriptu
if test -f ../.trunk
source ../.trunk
end
if test -f .track
source .track
end
Díky barbaros-init (fish funkce spouštěná při změně PWD) se přitom nastaví i proměnné TRUNK, TRACK, TRACK_DIR,PKG_NAMESPACE a PKG_DOMAIN — a .trunk/.track se znovu načtou i při vstupu do stromu $BARBAROS. Do .track se tak dají dát např.:
set -gx NIM nimony # kompilátor pro .nim/.nb
set PORT 2357 # port lokálního serveru
set PRUGA_FORMAT_ČASU "HH:mm"
play.fish /make.fish směrem ke kořenipruga-find-and-run-script hledá soubor od aktuálního adresáře směrem nahoru, dokud nenajde první play.fish / make.fish:
set -l dir (pwd)
while true
set -l file "$dir/$script_name"
if test -f "$file"
echo "📜 spouštím 📜 $file"
pruga-run $file $args
return $status
end
if test "$dir" = "/"
break
end
set dir (path dirname "$dir")
end
Takže zkratku v editoru můžeš použít kdekoli v projektu — ať jsi v pkg/,cli/ nebo pages/, vždy se spustí ten správný play.fish/make.fish z kořene projektu.
play.fish /make.fish — tenká slupkaSoubor play.fish v projektu dnes není žádný velký skript. Všechna logika je ve fish funkcích, takže stačí:
pruga-run $argv
Soubor make.fish totéž, jen si určí, co se má sestavit:
set -gx file ./cli/pruga/build/vps.nim
# set -gx file ./config/barbaros/domogled.nim
pruga-run $file $argv
file je jediná věc, kterou si nastavuješ podle projektu — jméno souboru (první argument) i další argumenty můžeš upravit přímo zde.
pruga-run — spuštění podle příponyFunkce pruga-run je jádro celého stacku. Podle přípony souboru pozná, jaký nástroj má spustit:
| Přípona | Nástroj |
|---|---|
.nim |
nim nebo nimony (podle NIM) |
.nb |
nim /nimony (nimib) |
.py |
python |
.php |
php |
.c/.cpp |
gcc |
.hs |
ghc |
.sh |
bash |
.fish |
fish |
.js |
node |
.qml |
qml |
.cj |
cjc (Cangjie) |
Pro .nim/.nb vybere kompilátor podle proměnné NIM (z .track):nim pro klasický Nim, jinak nimony.
pruga-target — kam se uloží výstupPro .nim/.nb vypočítápruga-run výstupní cestu funkcí pruga-target podle toho, kde soubor leží:
cli/<dir>/<subdir>/file.nim → $PRUGA_BIN/dir-subdir-file (výchozí $HOME/bin, přepíšeš proměnnou PRUGA_BIN)pkg/**/file.nim → file.test pkg/**/file.nb|.nimib → file.ndoc pages/**/file.nim → file.js pages/**/file.nb|.nimib → file.ndoc Výstup binárky se tedy nehází vedle zdrojáku, ale do $PRUGA_BIN — a testy balíčků (.test) zůstávají v pkg/.
editor (ctrl+shift+s / ctrl+shift+c — VS Code rozšíření pruga, Geany, …)
│ uloží soubor a spustí příkaz v terminálu
▼
pruga-play / pruga-make # fish funkce pluginu pruga
│
▼
pruga-find-and-run-script # načte ../.trunk a .track,
│ # najde play.fish / make.fish směrem ke kořeni
▼
pruga-run play.fish / make.fish # play.fish je jen pruga-run $argv
│ # make.fish jen set -gx file …; pruga-run $file $argv
▼
pruga-run <soubor> # podle přípony vybere nástroj
│
▼
pruga-target # výstupní cesta (cli → $PRUGA_BIN, pkg → .test, pages → .js/.ndoc)
│
▼
nim / nimony / python / php / gcc / ghc / bash / node / …
| Soubor | Obsah |
|---|---|
../.trunk |
nastavení celého trunku (načte se před skriptem) |
.track |
nastavení větve projektu: NIM, PORT, PRUGA_FORMAT_*, SSH údaje |
play.fish |
co se spustí při pruga play — zpracuje právě upravovaný soubor |
make.fish |
co se spustí při pruga make — sestaví celý projekt (proměnná file) |
VS Code settings.json |
pruga.play (výchozí ./play.fish),pruga.make (výchozí ./make.fish) |