Open-Source Wikis

/

Tauri

/

Crates

/

tauri-cli

tauri-apps/tauri

tauri-cli

Active contributors: Lucas Fernandes Nogueira, Amr Bashir, Fabian-Lars

Purpose

crates/tauri-cli is the tauri (and cargo tauri) command-line interface. It scaffolds projects, runs dev mode, builds release binaries, drives the bundler, generates icons, signs updater bundles, manages permissions/capabilities, runs Android/iOS builds, and migrates v1 projects to v2. It is also re-exported through napi-rs as @tauri-apps/cli (see packages/cli).

The crate is structured as one Rust file per subcommand under src/<subcommand>.rs (or src/<subcommand>/), with a single lib.rs that wires them into the clap Cli enum and dispatches.

Directory layout

crates/tauri-cli/
├── Cargo.toml
├── ENVIRONMENT_VARIABLES.md       # documents every TAURI_CLI_* / TAURI_* env var the CLI consumes
├── config.schema.json             # generated; mirror of the user-facing tauri.conf.json schema
├── tauri.config.schema.json
├── schema.json
├── src/
│   ├── main.rs                    # binary entry — calls lib::run
│   ├── lib.rs                     # 12,935 bytes: Cli enum, run(), try_run()
│   ├── init.rs                    # `tauri init`
│   ├── add.rs / remove.rs         # add/remove a plugin
│   ├── dev.rs / dev/              # dev mode (frontend dev server + cargo run + reload)
│   ├── build.rs                   # `tauri build`
│   ├── bundle.rs                  # `tauri bundle` (calls tauri-bundler)
│   ├── completions.rs             # shell completion generator
│   ├── icon.rs                    # generate icons (29 KB)
│   ├── info/                      # `tauri info` — env, packages, plugins, app inspection
│   ├── inspect.rs                 # `tauri inspect` — dump resolved config / ACL / capabilities
│   ├── interface/                 # cargo subprocess wrapper, dev-server probing
│   ├── helpers/                   # shared utilities
│   ├── mobile/                    # `tauri android` / `tauri ios`
│   ├── migrate/                   # v1 → v2 migration
│   ├── plugin/                    # `tauri plugin` subcommands
│   ├── acl/                       # `tauri permission` and `tauri capability`
│   ├── signer/                    # update-bundle key generation and signing
│   └── error.rs                   # CLI error type with anyhow context extension
├── scripts/                        # frontend probe scripts
├── templates/                      # `tauri init` templates
└── tests/

Key abstractions

Type / function File Role
Cli (clap derive) crates/tauri-cli/src/lib.rs Top-level command tree.
run / try_run crates/tauri-cli/src/lib.rs Public entry. run exits non-zero on error; try_run returns Result.
Commands enum crates/tauri-cli/src/lib.rs One variant per subcommand.
ConfigValue (FromStr) crates/tauri-cli/src/lib.rs Accepts JSON5/JSON/TOML config either inline or as a file path.
CommandExt trait crates/tauri-cli/src/lib.rs piped() and output_ok() for verbose subprocess invocation with stdio mirroring.
Per-subcommand Options + command crates/tauri-cli/src/<subcommand>.rs Each subcommand defines its own Options struct and command(opts) fn.

Subcommand index

Subcommand Implementation
init crates/tauri-cli/src/init.rs
dev crates/tauri-cli/src/dev.rs, dev/
build crates/tauri-cli/src/build.rs
bundle crates/tauri-cli/src/bundle.rs
info crates/tauri-cli/src/info/mod.rs (+ many helpers)
migrate crates/tauri-cli/src/migrate/
add / remove crates/tauri-cli/src/add.rs / remove.rs
plugin <new|init|android|ios> crates/tauri-cli/src/plugin/
icon crates/tauri-cli/src/icon.rs
signer <generate|sign> crates/tauri-cli/src/signer/
completions <shell> crates/tauri-cli/src/completions.rs
permission <add|remove|new|ls> crates/tauri-cli/src/acl/permission/
capability <new|ls> crates/tauri-cli/src/acl/capability/
inspect <wix-upgrade-code> crates/tauri-cli/src/inspect.rs
android <init|dev|build> crates/tauri-cli/src/mobile/android/
ios <init|dev|build> crates/tauri-cli/src/mobile/ios/

How it works

graph LR
    User["tauri / cargo tauri / @tauri-apps/cli"] --> Lib["lib.rs::run"]
    Lib --> Parse["clap parse"]
    Parse --> Dispatch["match Commands"]
    Dispatch --> Sub["subcommand::command(opts)"]
    Sub -->|"build/bundle"| Bundler["tauri-bundler"]
    Sub -->|"dev"| Cargo["cargo subprocess + dev server"]
    Sub -->|"signer"| Sign["minisign"]
    Sub -->|"android/ios"| Mobile["NDK / Xcode subprocess"]
    Sub -->|"info/inspect"| Read["read tauri.conf.json + Cargo metadata"]

The CLI prints structured output via env_logger configured in lib::try_run — actions get a green right-aligned label ( Running, Compiling). Verbosity is passed through TAURI_CLI_VERBOSITY so subprocesses (xcode-script, android-studio-script) inherit it.

Cargo features

  • Defaults pull in tauri-bundler/default.
  • native-tls / native-tls-vendored / rustls-tls toggle TLS backend for HTTP downloads (e.g. NSIS bootstrappers).

Integration points

  • Up: the binary tauri and cargo-tauri (same code, different bin_name); the Node addon at packages/cli.
  • Down: depends on tauri-bundler, tauri-utils, tauri-macos-sign, plus a long list of CLI-flavour deps (clap, dialoguer, handlebars, os_pipe, env_logger, napi-rs glue is in packages/cli).

Entry points for modification

Goal Start here
Add a new subcommand crates/tauri-cli/src/lib.rs (Commands enum + dispatch) and a new module
Change dev-server probing crates/tauri-cli/src/dev.rs and interface/
Fix bundler argument plumbing crates/tauri-cli/src/build.rs / bundle.rs
Add an info check (e.g. new tooling) crates/tauri-cli/src/info/
Migrate behaviour crates/tauri-cli/src/migrate/
Generate a different icon set crates/tauri-cli/src/icon.rs

See tauri-bundler for the packaging step the CLI orchestrates, and packages/cli for the npm wrapper.

Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.

tauri-cli – Tauri wiki | Factory