Pruga build stack

27. 9. 2026 14:44 (aktualizováno) Živoslav Petr Bolf

Build stack — od klávesy v editoru až ke spuštěnému programu

O čem to je

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.

1. Editor — klávesová zkratka

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.

VS Code rozšíření  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.

  • zdroj: https://codeberg.or­g/rodokrug/pruga-vscode
  • příkazy:  pruga.play a  pruga.make
  • nastavení:  pruga.play(výchozí  ./play.fish) a pruga.make  (výchozí  ./make.fish) — příkaz, který se spustí nad souborem / nad projektem
  • klávesové zkratky:  ctrl+shift+s →  pruga play,ctrl+shift+c  → pruga make  (na macu cmd+shift+s  /  cmd+shift+c)
  • chování: uloží aktivní dokument a v integrovaném terminálu („Ⱂⱃⱆⰳⰰ terminal") spustí konfigurovaný příkaz s názvem právě upravovaného souboru jako argumentem

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.

Jiné editory

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.

2.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

3. Načtení prostředí — .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"

4. Hledání play.fish  /make.fish  směrem ke kořeni

pruga-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.

5.play.fish  /make.fish  — tenká slupka

Soubor 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.

6.pruga-run  — spuštění podle přípony

Funkce 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.

7.pruga-target  — kam se uloží výstup

Pro  .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/.

Celý řetězec

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 / …

Kam se nastavení ukládá

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)

Sdílet