Pular para o conteúdo principal
Versão: Próxima

Runtime Virtual

O runtime virtual usa o interpretador de shell POSIX-compatível integrado do Invowk™ (powered by mvdan/sh). Ele fornece comportamento de shell consistente em todas as plataformas sem exigir um shell externo.

Como Funciona

Quando você executa um comando com o runtime virtual, o Invowk:

  1. Faz o parse do script usando o parser de shell integrado
  2. Executa-o em um ambiente embarcado tipo POSIX
  3. Fornece utilitários core (echo, test, etc.) integrados

Uso Básico

{
name: "build"
implementations: [{
script: """
echo "Building..."
go build -o bin/app ./...
echo "Done!"
"""
runtimes: [{name: "virtual"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}
invowk cmd build --ivk-runtime virtual

Consistência Multiplataforma

O runtime virtual se comporta de forma idêntica no Linux, macOS e Windows:

{
name: "setup"
implementations: [{
script: """
# This works the same everywhere!
if [ -d "node_modules" ]; then
echo "Dependencies already installed"
else
echo "Installing dependencies..."
npm install
fi
"""
runtimes: [{name: "virtual"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}

Chega de "funciona na minha máquina" para scripts shell!

Utilitários Integrados

O shell virtual inclui utilitários POSIX core:

UtilitárioDescrição
echoImprimir texto
printfSaída formatada
test / [Condicionais
true / falseSair com 0/1
pwdImprimir diretório de trabalho
cdMudar diretório
readLer entrada
exportDefinir variáveis de ambiente

Utilitários Estendidos (u-root)

Quando habilitado na configuração (padrão: true), 28 utilitários adicionais compatíveis com POSIX da biblioteca u-root ficam disponíveis. Isso inclui 12 wrappers upstream do u-root e 16 implementações customizadas.

// In your config file
virtual_shell: {
enable_uroot_utils: true
}

Operações de Arquivo (14 utilitários)

UtilitárioDescriçãoFlags Comuns
base64Codificar/decodificar base64-d (decodificar)
catConcatenar e exibir arquivos-u (ignorado, compatibilidade)
cpCopiar arquivos e diretórios-r (recursivo), -f (forçar)
findBuscar arquivos em uma hierarquia de diretórios-name (padrão), -type (f, d, l)
gzipComprimir ou expandir arquivos-d (descomprimir), -c (stdout), -f (forçar)
lnCriar links físicos ou simbólicos-s (simbólico), -f (forçar)
lsListar conteúdo de diretórios-l (longo), -a (todos), -R (recursivo)
mkdirCriar diretórios-p (criar pais)
mktempCriar arquivos ou diretórios temporários-d (diretório), -p (diretório prefixo)
mvMover ou renomear arquivos-f (forçar), -n (não sobrescrever)
realpathResolver nomes de caminho absolutos(nenhum)
rmRemover arquivos e diretórios-r (recursivo), -f (forçar)
tarArquivar arquivos-c (criar), -x (extrair), -f (arquivo)
touchCriar ou atualizar timestamps de arquivos-c (não criar)

Processamento de Texto (10 utilitários)

UtilitárioDescriçãoFlags Comuns
basenameRemover diretório e sufixo de nomes de arquivo(nenhum)
cutSelecionar porções de linhas-d (delimitador), -f (campos)
dirnameRemover último componente de nomes de arquivo(nenhum)
grepBuscar padrões-i (ignorar maiúsculas), -v (inverter), -n (números de linha)
headExibir primeiras N linhas-n <num> (padrão 10)
sortOrdenar linhas-r (reverso), -n (numérico), -u (único)
tailExibir últimas N linhas-n <num> (padrão 10)
trTraduzir caracteresSET1 SET2 (mapeamento de caracteres)
uniqFiltrar linhas duplicadas adjacentes-c (contar), -d (somente duplicatas)
wcContar linhas, palavras, bytes-l (linhas), -w (palavras), -c (bytes)

Outros Utilitários (4 utilitários)

UtilitárioDescriçãoFlags Comuns
seqGerar sequências numéricas-s (separador), -w (largura igual)
shasumCalcular message digests SHA-a (algoritmo: 1, 256, 512)
sleepPausar por um tempo especificado(nenhum -- recebe argumento de duração)
teeDuplicar entrada padrão para arquivos-a (append)
observação

Estes utilitários implementam comportamento POSIX. Flags específicas do GNU (como --color, --time-style) são silenciosamente ignoradas para compatibilidade.

Identificação de Erros

Erros dos utilitários u-root são prefixados com [uroot] para fácil identificação:

[uroot] cp: /source/file: no such file or directory
[uroot] rm: /protected: permission denied

Sem Fallback Silencioso

Se um comando u-root falha, ele retorna um erro imediatamente. O sistema não faz fallback para binários do host, garantindo que bugs sejam detectados em vez de mascarados.

Recursos do Shell POSIX

O shell virtual suporta construções POSIX padrão:

Variáveis

script: """
NAME="World"
echo "Hello, $NAME!"

# Parameter expansion
echo "${NAME:-default}"
echo "${#NAME}" # Length
"""

Condicionais

script: """
if [ "$ENV" = "production" ]; then
echo "Production mode"
elif [ "$ENV" = "staging" ]; then
echo "Staging mode"
else
echo "Development mode"
fi
"""

Loops

script: """
# For loop
for file in *.go; do
echo "Processing $file"
done

# While loop
count=0
while [ $count -lt 5 ]; do
echo "Count: $count"
count=$((count + 1))
done
"""

Funções

script: """
greet() {
echo "Hello, $1!"
}

greet "World"
greet "Invowk"
"""

Subshells e Substituição de Comandos

script: """
# Command substitution
current_date=$(date +%Y-%m-%d)
echo "Today is $current_date"

# Subshell
(cd /tmp && echo "In temp: $(pwd)")
echo "Still in: $(pwd)"
"""

Chamando Comandos Externos

O shell virtual pode chamar comandos externos instalados no seu sistema:

script: """
# Calls the real 'go' binary
go version

# Calls the real 'git' binary
git status
"""

Comandos externos são encontrados usando o PATH do sistema.

Variáveis de Ambiente

Variáveis de ambiente funcionam da mesma forma que no native:

{
name: "build"
env: {
vars: {
BUILD_MODE: "release"
}
}
implementations: [{
script: """
echo "Building in $BUILD_MODE mode"
go build -ldflags="-s -w" ./...
"""
runtimes: [{name: "virtual"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}

Flags e Argumentos

Acesse flags e argumentos da mesma forma:

{
name: "greet"
args: [{name: "name", description: "Name to greet", default_value: "World"}]
implementations: [{
script: """
# Using environment variable
echo "Hello, $INVOWK_ARG_NAME!"

# Or positional parameter
echo "Hello, $1!"
"""
runtimes: [{name: "virtual"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}

Limitações

Sem Suporte a Interpretadores

O runtime virtual não pode usar interpretadores não-shell:

// This will NOT work with virtual runtime!
// The "interpreter" field is not allowed on #RuntimeConfigVirtual —
// CUE schema validation will reject this at parse time.
{
name: "bad-example"
implementations: [{
script: """
#!/usr/bin/env python3
print("This won't work!")
"""
runtimes: [{
name: "virtual"
interpreter: "python3" // CUE validation error: field not allowed
}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}

Para Python, Ruby ou outros interpretadores, use o runtime native ou container.

Recursos Específicos do Bash

Alguns recursos específicos do bash não estão disponíveis:

// These won't work in virtual runtime:
script: """
# Bash arrays (use $@ instead)
declare -a arr=(1 2 3) # Not supported

# Bash-specific parameter expansion
${var^^} # Uppercase - not supported
${var,,} # Lowercase - not supported

# Process substitution
diff <(cmd1) <(cmd2) # Not supported
"""

Mantenha construções POSIX-compatíveis para o runtime virtual.

Validação de Dependências

Dependências são validadas contra as capacidades do shell virtual:

{
name: "build"
depends_on: {
tools: [
// These will be checked in the virtual shell environment
{alternatives: ["go"]},
{alternatives: ["git"]}
]
}
implementations: [{
script: "go build ./..."
runtimes: [{name: "virtual"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}

Vantagens

  • Consistência: Mesmo comportamento no Linux, macOS e Windows
  • Sem dependência de shell: Funciona mesmo se o shell do sistema não estiver disponível
  • Portabilidade: Scripts funcionam em todas as plataformas
  • Utilitários integrados: Utilitários core sempre disponíveis
  • Startup mais rápido: Sem processo de shell para iniciar

Quando Usar Virtual

  • Scripts multiplataforma: Quando o mesmo script deve funcionar em todos os lugares
  • Pipelines CI/CD: Comportamento consistente entre agentes de build
  • Scripts shell simples: Quando você não precisa de recursos específicos do bash
  • Ambientes embarcados: Quando shells externos não estão disponíveis

Configuração

Configure o shell virtual no seu arquivo de configuração do Invowk:

// ~/.config/invowk/config.cue (Linux)
// ~/Library/Application Support/invowk/config.cue (macOS)
// %APPDATA%invowkconfig.cue (Windows)

virtual_shell: {
// Enable additional utilities from u-root
enable_uroot_utils: true
}

Próximos Passos