Skip to content

A flag --define pode ser usada com bun build e bun build --compile para injetar constantes de tempo de build em sua aplicação. Isso é especialmente útil para incorporar metadados como versões de build, timestamps ou flags de configuração diretamente em seus executáveis compilados.

sh
bun build --compile --define BUILD_VERSION='"1.2.3"' --define BUILD_TIME='"2024-01-15T10:30:00Z"' src/index.ts --outfile myapp

Por que usar constantes de tempo de build?

Constantes de tempo de build são incorporadas diretamente em seu código compilado, tornando-as:

  • Zero overhead em tempo de execução - Sem lookups de variáveis de ambiente ou leituras de arquivo
  • Imutáveis - Valores são embutidos no binário em tempo de compilação
  • Otimizáveis - Eliminação de código morto pode remover branches não utilizados
  • Seguras - Sem dependências externas ou arquivos de configuração para gerenciar

Isso é similar a gcc -D ou #define em C/C++, mas para JavaScript/TypeScript.


Uso básico

Com bun build

sh
# Bundle com constantes de tempo de build
bun build --define BUILD_VERSION='"1.0.0"' --define NODE_ENV='"production"' src/index.ts --outdir ./dist

Com bun build --compile

sh
# Compilar para executável com constantes de tempo de build
bun build --compile --define BUILD_VERSION='"1.0.0"' --define BUILD_TIME='"2024-01-15T10:30:00Z"' src/cli.ts --outfile mycli

API JavaScript

ts
await Bun.build({
  entrypoints: ["./src/index.ts"],
  outdir: "./dist",
  define: {
    BUILD_VERSION: '"1.0.0"',
    BUILD_TIME: '"2024-01-15T10:30:00Z"',
    DEBUG: "false",
  },
});

Casos de uso comuns

Informações de versão

Incorpore versão e metadados de build diretamente em seu executável:

ts
// Estas constantes são substituídas em tempo de build
declare const BUILD_VERSION: string;
declare const BUILD_TIME: string;
declare const GIT_COMMIT: string;

export function getVersion() {
  return {
    version: BUILD_VERSION,
    buildTime: BUILD_TIME,
    commit: GIT_COMMIT,
  };
}
sh
bun build --compile \
  --define BUILD_VERSION='"1.2.3"' \
  --define BUILD_TIME='"2024-01-15T10:30:00Z"' \
  --define GIT_COMMIT='"abc123"' \
  src/cli.ts --outfile mycli

Flags de recurso

Use constantes de tempo de build para habilitar/desabilitar recursos:

ts
// Substituído em tempo de build
declare const ENABLE_ANALYTICS: boolean;
declare const ENABLE_DEBUG: boolean;

function trackEvent(event: string) {
  if (ENABLE_ANALYTICS) {
    // Este bloco inteiro é removido se ENABLE_ANALYTICS for false
    console.log("Tracking:", event);
  }
}

if (ENABLE_DEBUG) {
  console.log("Modo debug habilitado");
}
sh
# Build de produção - analytics habilitado, debug desabilitado
bun build --compile --define ENABLE_ANALYTICS=true --define ENABLE_DEBUG=false src/app.ts --outfile app-prod

# Build de desenvolvimento - ambos habilitados
bun build --compile --define ENABLE_ANALYTICS=false --define ENABLE_DEBUG=true src/app.ts --outfile app-dev

Configuração

Substitua objetos de configuração em tempo de build:

ts
declare const CONFIG: {
  apiUrl: string;
  timeout: number;
  retries: number;
};

// CONFIG é substituído pelo objeto real em tempo de build
const response = await fetch(CONFIG.apiUrl, {
  timeout: CONFIG.timeout,
});
sh
bun build --compile --define 'CONFIG={"apiUrl":"https://api.example.com","timeout":5000,"retries":3}' src/app.ts --outfile app

Padrões avançados

Builds específicos por ambiente

Crie executáveis diferentes para ambientes diferentes:

json
{
  "scripts": {
    "build:dev": "bun build --compile --define NODE_ENV='\"development\"' --define API_URL='\"http://localhost:3000\"' src/app.ts --outfile app-dev",
    "build:staging": "bun build --compile --define NODE_ENV='\"staging\"' --define API_URL='\"https://staging.example.com\"' src/app.ts --outfile app-staging",
    "build:prod": "bun build --compile --define NODE_ENV='\"production\"' --define API_URL='\"https://api.example.com\"' src/app.ts --outfile app-prod"
  }
}

Usando comandos shell para valores dinâmicos

Gere constantes de tempo de build a partir de comandos shell:

sh
# Use git para obter o commit atual e timestamp
bun build --compile \
  --define BUILD_VERSION="\"$(git describe --tags --always)\"" \
  --define BUILD_TIME="\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"" \
  --define GIT_COMMIT="\"$(git rev-parse HEAD)\"" \
  src/cli.ts --outfile mycli

Script de automação de build

Crie um script de build que automaticamente injeta metadados de build:

ts
// build.ts
import { $ } from "bun";

const version = await $`git describe --tags --always`.text();
const buildTime = new Date().toISOString();
const gitCommit = await $`git rev-parse HEAD`.text();

await Bun.build({
  entrypoints: ["./src/cli.ts"],
  outdir: "./dist",
  define: {
    BUILD_VERSION: JSON.stringify(version.trim()),
    BUILD_TIME: JSON.stringify(buildTime),
    GIT_COMMIT: JSON.stringify(gitCommit.trim()),
  },
});

console.log(`Build realizado com versão ${version.trim()}`);

Considerações importantes

Formato de valor

Valores devem ser JSON válido que será analisado e incorporado como expressões JavaScript:

sh
# ✅ Strings devem ser entre aspas JSON
--define VERSION='"1.0.0"'

# ✅ Números são literais JSON
--define PORT=3000

# ✅ Booleanos são literais JSON
--define DEBUG=true

# ✅ Objetos e arrays (use aspas simples para envolver o JSON)
--define 'CONFIG={"host":"localhost","port":3000}'

# ✅ Arrays funcionam também
--define 'FEATURES=["auth","billing","analytics"]'

# ❌ Isso não funciona - faltam aspas na string
--define VERSION=1.0.0

Chaves de propriedade

Você pode usar padrões de acesso a propriedade como chaves, não apenas identificadores simples:

sh
# ✅ Substitui process.env.NODE_ENV por "production"
--define 'process.env.NODE_ENV="production"'

# ✅ Substitui process.env.API_KEY pela chave real
--define 'process.env.API_KEY="abc123"'

# ✅ Substitui propriedades aninhadas
--define 'window.myApp.version="1.0.0"'

# ✅ Substitui acesso a array
--define 'process.argv[2]="--production"'

Isso é particularmente útil para variáveis de ambiente:

ts
// Antes da compilação
if (process.env.NODE_ENV === "production") {
  console.log("Modo produção");
}

// Depois da compilação com --define 'process.env.NODE_ENV="production"'
if ("production" === "production") {
  console.log("Modo produção");
}

// Depois da otimização
console.log("Modo produção");

Declarações TypeScript

Para projetos TypeScript, declare suas constantes para evitar erros de tipo:

ts
// types/build-constants.d.ts
declare const BUILD_VERSION: string;
declare const BUILD_TIME: string;
declare const NODE_ENV: "development" | "staging" | "production";
declare const DEBUG: boolean;

Compatibilidade cross-platform

Ao buildar para múltiplas plataformas, constantes funcionam da mesma forma:

sh
# Linux
bun build --compile --target=bun-linux-x64 --define PLATFORM='"linux"' src/app.ts --outfile app-linux

# macOS
bun build --compile --target=bun-darwin-x64 --define PLATFORM='"darwin"' src/app.ts --outfile app-macos

# Windows
bun build --compile --target=bun-windows-x64 --define PLATFORM='"windows"' src/app.ts --outfile app-windows.exe

Relacionado

Bun by www.bunjs.com.cn edit