Precedência de Ambiente
Quando a mesma variável é definida em múltiplos lugares, o Invowk™ segue uma ordem de precedência específica. Fontes com maior precedência sobrescrevem as de menor.
Ordem de Precedência
Da maior para a menor prioridade:
| Prioridade | Fonte | Exemplo |
|---|---|---|
| 1 | Vars da CLI | --env-var KEY=value |
| 2 | Arquivos env da CLI | --env-file .env.local |
| 3 | Vars do Invowk | INVOWK_FLAG_*, INVOWK_ARG_* |
| 4 | Vars de implementação | implementations[].env.vars |
| 5 | Vars de comando | command.env.vars |
| 6 | Vars raiz | root.env.vars |
| 7 | Arquivos de implementação | implementations[].env.files |
| 8 | Arquivos de comando | command.env.files |
| 9 | Arquivos raiz | root.env.files |
| 10 | Ambiente do sistema | Ambiente do host (se env_inherit_mode permitir) |
Hierarquia Visual
CLI (highest priority)
├── --invk-env-var KEY=value
└── --invk-env-file .env.local
│
Invowk Vars
├── INVOWK_FLAG_*
└── INVOWK_ARG_*
│
Implementation Level
├── env.vars
└── env.files
│
Command Level
├── env.vars
└── env.files
│
Root Level
├── env.vars
└── env.files
│
System Environment (lowest priority)
Passo a Passo de Exemplo
Dado este invkfile:
// Root level
env: {
files: [".env"]
vars: {
API_URL: "http://root.example.com"
LOG_LEVEL: "info"
}
}
cmds: [
{
name: "build"
// Command level
env: {
files: [".env.build"]
vars: {
API_URL: "http://command.example.com"
BUILD_MODE: "development"
}
}
implementations: [{
script: "echo $API_URL $LOG_LEVEL $BUILD_MODE $NODE_ENV"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]
// Implementation level
env: {
vars: {
BUILD_MODE: "production"
NODE_ENV: "production"
}
}
}]
}
]
E estes arquivos:
# .env
API_URL=http://envfile.example.com
DATABASE_URL=postgres://localhost/db
# .env.build
BUILD_MODE=release
CACHE_DIR=./cache
Ordem de Resolução
-
Começar com ambiente do sistema (ex.:
PATH,HOME) seenv_inherit_modenão fornone -
Carregar arquivos raiz (
.env):API_URL=http://envfile.example.comDATABASE_URL=postgres://localhost/db
-
Carregar arquivos de comando (
.env.build):BUILD_MODE=releaseCACHE_DIR=./cache
-
Carregar arquivos de implementação (
implementations[].env.files):- (nenhum neste exemplo)
-
Aplicar vars raiz (sobrescrever arquivos):
API_URL=http://root.example.com← sobrescreve.envLOG_LEVEL=info
-
Aplicar vars de comando (sobrescrever arquivos):
API_URL=http://command.example.com← sobrescreve raizBUILD_MODE=development← sobrescreve.env.build
-
Aplicar vars de implementação:
BUILD_MODE=production← sobrescreve comandoNODE_ENV=production
-
Aplicar vars do Invowk (flags/args):
INVOWK_FLAG_*,INVOWK_ARG_*(se presentes)
-
Aplicar sobrescritas da CLI (se fornecidas):
--env-filee depois--env-var(maior prioridade)
Resultado Final
API_URL=http://command.example.com # From command vars
LOG_LEVEL=info # From root vars
BUILD_MODE=production # From implementation vars
NODE_ENV=production # From implementation vars
DATABASE_URL=postgres://localhost/db # From .env file
CACHE_DIR=./cache # From .env.build file
Com Sobrescrita da CLI
invowk cmd build --invk-env-var API_URL=http://cli.example.com
Agora API_URL=http://cli.example.com porque CLI tem a maior prioridade.
Arquivos vs Vars no Mesmo Nível
Dentro do mesmo nível, vars sobrescreve files:
env: {
files: [".env"] // API_URL=from-file
vars: {
API_URL: "from-vars" // This wins
}
}
Múltiplos Arquivos no Mesmo Nível
Arquivos são carregados em ordem; arquivos posteriores sobrescrevem anteriores:
env: {
files: [
".env", // API_URL=base
".env.local", // API_URL=local (wins)
]
}
Variáveis Específicas de Plataforma
Para variáveis de ambiente específicas por plataforma, use implementações separadas por plataforma:
// Platform-specific env requires separate implementations
implementations: [
{
script: "echo $CONFIG_PATH"
runtimes: [{name: "native"}]
platforms: [{name: "linux"}]
env: {
vars: {
CONFIG_PATH: "/etc/app"
OTHER_VAR: "value"
}
}
},
{
script: "echo $CONFIG_PATH"
runtimes: [{name: "native"}]
platforms: [{name: "macos"}]
env: {
vars: {
CONFIG_PATH: "/usr/local/etc/app"
OTHER_VAR: "value"
}
}
}
]
Cada implementação tem seu próprio env que é aplicado quando aquela plataforma é selecionada.
Melhores Práticas
Use Níveis Apropriados
// Root: shared across all commands
env: {
vars: {
PROJECT_NAME: "myapp"
VERSION: "1.0.0"
}
}
// Command: specific to this command
{
name: "build"
env: {
vars: {
BUILD_TARGET: "production"
}
}
}
// Implementation: specific to this runtime
implementations: [{
runtimes: [{name: "container", image: "node:20"}]
platforms: [{name: "linux"}]
env: {
vars: {
NODE_OPTIONS: "--max-old-space-size=4096"
}
}
}]
Padrão de Sobrescrita
Config base em arquivos, sobrescritas em vars:
env: {
files: [".env"] // Defaults
vars: {
OVERRIDE_THIS: "value" // Specific override
}
}
Desenvolvimento Local
Use arquivos locais opcionais para sobrescritas de desenvolvedor:
env: {
files: [
".env", // Committed defaults
".env.local?", // Not committed, personal overrides
]
}
CLI para Sobrescritas Temporárias
# Quick test with different config
invowk cmd build --invk-env-var DEBUG=true --invk-env-var LOG_LEVEL=debug
Debugando Precedência
Para ver valores finais, adicione saída de debug:
{
name: "debug-env"
implementations: [{
script: """
echo "API_URL=$API_URL"
echo "LOG_LEVEL=$LOG_LEVEL"
echo "BUILD_MODE=$BUILD_MODE"
env | sort
"""
runtimes: [{name: "native"}]
platforms: [{name: "linux"}, {name: "macos"}]
}]
}