Pular para o conteúdo principal
Versão: 0.3.0

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

  1. Use caminhos relativos: Mais portável entre máquinas
  2. Barras para frente: Compatível com múltiplas plataformas
  3. Nível raiz para padrões: Sobrescreva onde necessário
  4. Mantenha caminhos curtos: Mais fácil de entender

Próximos Passos