mirror of
https://github.com/instructkr/claw-code.git
synced 2026-10-19 00:00:08 +08:00
204 lines
4.6 KiB
Markdown
204 lines
4.6 KiB
Markdown
# Nix flake development environment
|
|
|
|
This repository includes a **`flake.nix`** for reproducible development environments on NixOS and systems with Nix installed.
|
|
|
|
## Prerequisites
|
|
|
|
- **Nix** (version 2.4 or later with flakes support enabled)
|
|
- **direnv** (optional, for automatic environment loading via `.envrc`)
|
|
|
|
To verify Nix is installed and flakes are enabled:
|
|
|
|
```bash
|
|
nix --version
|
|
nix flake --help
|
|
```
|
|
|
|
If flakes are not enabled, add this to your `~/.config/nix/nix.conf`:
|
|
|
|
```
|
|
experimental-features = nix-command flakes
|
|
```
|
|
|
|
## Quick start
|
|
|
|
### Enter the development environment
|
|
|
|
**Option 1: Using `nix flake`** (without direnv)
|
|
|
|
```bash
|
|
nix flake update # Update inputs (optional, pins nixpkgs)
|
|
nix develop # Enter default dev shell
|
|
nix develop .#full # Enter full dev shell with extra tools
|
|
exit # Leave the shell
|
|
```
|
|
|
|
**Option 2: Using direnv** (automatic on directory entry)
|
|
|
|
```bash
|
|
direnv allow # Trust the .envrc file (one-time setup)
|
|
cd . # Direnv reloads the flake automatically
|
|
```
|
|
|
|
When you leave the repository directory, the environment is automatically unloaded.
|
|
|
|
## Development shells
|
|
|
|
The flake provides two development shells:
|
|
|
|
### `default` (minimal)
|
|
|
|
```bash
|
|
nix develop
|
|
```
|
|
|
|
Includes:
|
|
- Rust (stable, latest)
|
|
- Rust source code (`rust-src`)
|
|
- `cargo-edit` (dependency management helpers)
|
|
- `cargo-expand` (macro expansion tool)
|
|
- `cargo-watch` (file watcher for incremental builds)
|
|
- Build tools: `pkg-config`, `openssl`, `git`, `ca-certificates`
|
|
|
|
### `full` (with extra tooling)
|
|
|
|
```bash
|
|
nix develop .#full
|
|
```
|
|
|
|
Includes everything from `default` plus:
|
|
- `clippy` (linter)
|
|
- `rustfmt` (code formatter)
|
|
- `mold` (fast linker)
|
|
- `lldb` (debugger)
|
|
|
|
## Building the claw binary
|
|
|
|
### With the dev environment
|
|
|
|
```bash
|
|
nix develop
|
|
cd rust
|
|
cargo build -p rusty-claude-cli
|
|
```
|
|
|
|
### Directly with `nix build`
|
|
|
|
```bash
|
|
nix build .#claw # Build the claw binary
|
|
nix build # Same as .#claw (default package)
|
|
```
|
|
|
|
The compiled binary is symlinked to `./result/bin/claw`.
|
|
|
|
## Running common tasks
|
|
|
|
Once in the dev shell:
|
|
|
|
```bash
|
|
# Format code
|
|
cd rust
|
|
cargo fmt
|
|
|
|
# Run clippy linter
|
|
cargo clippy --workspace --all-targets -- -D warnings
|
|
|
|
# Run all tests
|
|
cargo test --workspace
|
|
|
|
# Run tests for a specific crate
|
|
cargo test -p rusty-claude-cli
|
|
|
|
# Build with optimizations
|
|
cargo build --release -p rusty-claude-cli
|
|
```
|
|
|
|
## Environment variables
|
|
|
|
The flake automatically sets:
|
|
|
|
- `RUSTUP_TOOLCHAIN=stable` — uses stable Rust from nixpkgs
|
|
- Standard Rust build flags are inherited from the environment
|
|
|
|
For development, the minimal dev shell includes a helpful message on entry:
|
|
|
|
```
|
|
Claw Code development environment
|
|
Run 'cargo build -p rusty-claude-cli' to build the claw binary
|
|
Run 'cargo test --workspace' to run tests
|
|
Run 'scripts/fmt.sh' to format code
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### `command not found: nix`
|
|
|
|
Nix is not installed. Install it from [nixos.org/download.html](https://nixos.org/download.html).
|
|
|
|
### `error: experimental Nix feature 'flakes' is disabled`
|
|
|
|
Enable flakes in your Nix configuration (`~/.config/nix/nix.conf` or `/etc/nix/nix.conf`):
|
|
|
|
```
|
|
experimental-features = nix-command flakes
|
|
```
|
|
|
|
### `error: ... does not provide attribute 'claw'`
|
|
|
|
The flake structure may have changed. Try updating:
|
|
|
|
```bash
|
|
nix flake update
|
|
nix flake check
|
|
```
|
|
|
|
### Rebuilds are slow after updating dependencies
|
|
|
|
Cargo will recompile dependencies if `Cargo.lock` changes. This is expected:
|
|
|
|
```bash
|
|
nix build --rebuild
|
|
```
|
|
|
|
### `cache lock file needs to be updated`
|
|
|
|
The Cargo.lock in `rust/` needs to be committed. Run:
|
|
|
|
```bash
|
|
cd rust
|
|
cargo generate-lockfile
|
|
git add Cargo.lock
|
|
git commit -m "update: Cargo.lock"
|
|
```
|
|
|
|
## Integration with other tools
|
|
|
|
### IDE integration (VS Code, IntelliJ, etc.)
|
|
|
|
Many IDEs can detect and use Nix environments. Direnv integration is recommended:
|
|
|
|
1. Install the direnv extension
|
|
2. Enable `direnv` shell integration in your IDE
|
|
3. Run `direnv allow` in the repository
|
|
|
|
Your IDE will automatically use the correct Rust toolchain and dependencies from the flake.
|
|
|
|
### CI/CD
|
|
|
|
For GitHub Actions, consider using [cachix/install-nix-action](https://github.com/cachix/install-nix-action) to set up Nix on the runner:
|
|
|
|
```yaml
|
|
- uses: cachix/install-nix-action@v18
|
|
with:
|
|
nix_path: nixpkgs=channel:nixos-unstable
|
|
extra_nix_config: "experimental-features = nix-command flakes"
|
|
|
|
- run: nix develop -c cargo test --workspace
|
|
```
|
|
|
|
## More information
|
|
|
|
- [NixOS flakes documentation](https://nixos.wiki/wiki/Flakes)
|
|
- [Direnv documentation](https://direnv.net/)
|
|
- [Rust on Nix](https://github.com/oxalica/rust-overlay)
|