Diretório de Trabalho
Controle onde seus comandos executam com a configuração workdir. Isso é especialmente útil para monorepos e projetos com estruturas de diretório complexas.
Comportamento Padrão
Por padrão, comandos do invowkfile raiz rodam no diretório onde o invowkfile está localizado. Para módulos, comandos rodam no diretório raiz do módulo. Caminhos workdir relativos são resolvidos a partir desses locais.
Definindo o Diretório de Trabalho
Nível de Comando
{
name: "build frontend"
workdir: "./frontend" // Run in frontend subdirectory
implementations: [{
script: "npm run build"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}
Nível de Implementação
{
name: "build"
implementations: [
{
script: "npm run build"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
workdir: "./web" // This implementation runs in ./web
},
{
script: "go build ./..."
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
workdir: "./api" // This implementation runs in ./api
}
]
}
Nível Raiz
workdir: "./src" // All commands default to ./src
cmds: [
{
name: "build"
// Inherits workdir: ./src
implementations: [...]
},
{
name: "test"
workdir: "./tests" // Override to ./tests
implementations: [...]
}
]
Sobrescrita pela CLI
Sobrescreva o diretório de trabalho em tempo de execução:
invowk cmd build --ivk-workdir ./frontend
Tipos de Caminho
Caminhos Relativos
Relativo à localização do invowkfile:
workdir: "./frontend"
workdir: "../shared"
workdir: "src/app"
Caminhos Absolutos
Caminhos completos do sistema:
workdir: "/opt/myapp"
workdir: "/home/user/projects/myapp"
Variáveis de Ambiente
Expanda variáveis em caminhos:
workdir: "${HOME}/projects/myapp"
workdir: "${PROJECT_ROOT}/src"
Precedência
Sobrescrita pela CLI (--ivk-workdir) sobrescreve implementação, que sobrescreve comando, que sobrescreve raiz:
// --ivk-workdir (CLI) > implementation > command > root
workdir: "./root" // Lowest: ./root
cmds: [
{
name: "build"
workdir: "./command" // Override: ./command
implementations: [
{
script: "make"
workdir: "./implementation" // Override: ./implementation
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}
]
}
]
Padrão Monorepo
Perfeito para monorepos com múltiplos pacotes:
cmds: [
{
name: "web build"
workdir: "./packages/web"
implementations: [{
script: "npm run build"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
},
{
name: "api build"
workdir: "./packages/api"
implementations: [{
script: "go build ./..."
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
},
{
name: "mobile build"
workdir: "./packages/mobile"
implementations: [{
script: "flutter build"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}
]
Diretório de Trabalho em Container
Para containers, o diretório atual é montado em /workspace:
{
name: "build"
implementations: [{
script: """
pwd # /workspace
ls # Shows your project files
"""
runtimes: [{name: "container", image: "debian:stable-slim"}]
platforms: [{name: "linux"}]
}]
}
Com workdir, esse subdiretório se torna o diretório de trabalho do container:
{
name: "build frontend"
workdir: "./frontend"
implementations: [{
script: """
pwd # /workspace/frontend
npm run build
"""
runtimes: [{name: "container", image: "node:20"}]
platforms: [{name: "linux"}]
}]
}
Caminhos Multiplataforma
Use barras para frente para compatibilidade multiplataforma:
// Good - works everywhere
workdir: "./src/app"
// Avoid - Windows-specific
workdir: ".srcapp"
O Invowk™ converte automaticamente para separadores de caminho nativos em tempo de execução.
Exemplos do Mundo Real
Divisão Frontend/Backend
cmds: [
{
name: "start frontend"
workdir: "./frontend"
implementations: [{
script: "npm run dev"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
},
{
name: "start backend"
workdir: "./backend"
implementations: [{
script: "go run ./cmd/server"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}
]
Organização de Testes
cmds: [
{
name: "test unit"
workdir: "./tests/unit"
implementations: [{
script: "pytest"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]
}]
},
{
name: "test integration"
workdir: "./tests/integration"
implementations: [{
script: "pytest"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]
}]
},
{
name: "test e2e"
workdir: "./tests/e2e"
implementations: [{
script: "cypress run"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}
]
Build em Subdiretório
{
name: "build"
workdir: "./src"
implementations: [{
script: """
# Now in ./src
go build -o ../bin/app ./...
"""
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}, {name: "windows"}]
}]
}
Melhores Práticas
- Use caminhos relativos: Mais portável entre máquinas
- Barras para frente: Compatível com múltiplas plataformas
- Nível raiz para padrões: Sobrescreva onde necessário
- Mantenha caminhos curtos: Mais fácil de entender
Próximos Passos
- Interpretadores - Usar interpretadores não-shell
- Específico de Plataforma - Implementações por plataforma