Skip to content

Exec ​

The Exec resource allows you to execute shell commands as part of your Alchemy infrastructure. It provides a way to run system commands with full control over the execution environment and output handling.

Minimal Example ​

Execute a simple shell command:

ts
import { Exec } from "alchemy/os";

const result = await Exec("list-files", {
  command: "ls -la"
});

console.log(result.stdout);

Working Directory and Environment ​

Run a command in a specific directory with custom environment variables:

ts
import { Exec } from "alchemy/os";

const build = await Exec("build-project", {
  command: "npm run build",
  cwd: "./my-project",
  env: { 
    NODE_ENV: "production"
  }
});

Command Memoization ​

Basic Memoization ​

Cache command output and only re-run when the command changes:

ts
import { Exec } from "alchemy/os";

const status = await Exec("git-status", {
  command: "git status",
  memoize: true
});

File-Based Memoization ​

Memoize commands based on file contents. The command will be re-executed if either:

  1. The command string changes, or
  2. The contents of any files matching the glob patterns change
ts
import { Exec } from "alchemy/os";

// Memoize database migrations based on schema files
const migrate = await Exec("db-migrate", {
  command: "drizzle-kit push:pg",
  memoize: {
    patterns: ["./src/db/schema/**"]
  }
});

Build Commands with Memoization ​

When using memoization with build commands, be aware that build outputs won't be produced if the command is memoized. For build commands, consider disabling memoization in CI environments:

ts
import { Exec } from "alchemy/os";

const build = await Exec("build", {
  command: "vite build",
  memoize: process.env.CI ? false : {
    patterns: ["./src/**"]
  }
});

Custom Buffer Size ​

Handle large command output by increasing the buffer size:

ts
import { Exec } from "alchemy/os";

const logs = await Exec("get-logs", {
  command: "cat large-log-file.log", 
  maxBuffer: 10 * 1024 * 1024 // 10MB
});