temp add
This commit is contained in:
@@ -0,0 +1,249 @@
|
||||
# Cross-Platform Nix Configuration
|
||||
|
||||
A modular Nix configuration that works on both macOS (via nix-darwin) and Linux (NixOS), with maximum config sharing through home-manager.
|
||||
|
||||
## Structure
|
||||
|
||||
```
|
||||
├── flake.nix # Main flake configuration
|
||||
├── common.nix # Shared system-level config (NixOS & nix-darwin)
|
||||
│
|
||||
├── darwin/ # macOS system configuration
|
||||
│ └── configuration.nix
|
||||
│
|
||||
├── nixos/ # NixOS system configuration
|
||||
│ ├── configuration.nix
|
||||
│ └── hardware-configuration.nix
|
||||
│
|
||||
├── home-manager/ # User environment (shared across platforms)
|
||||
│ ├── home.nix # Main home-manager config
|
||||
│ ├── common.nix # Base configuration
|
||||
│ ├── development.nix # Development tools
|
||||
│ ├── shell.nix # Shell configuration
|
||||
│ ├── terminal.nix # Terminal apps & utilities
|
||||
│ ├── linux.nix # Linux-specific overrides
|
||||
│ └── darwin.nix # macOS-specific overrides
|
||||
│
|
||||
├── modules/
|
||||
│ ├── home-manager/ # Shared home-manager modules
|
||||
│ ├── nixos/ # NixOS-specific modules
|
||||
│ └── darwin/ # nix-darwin-specific modules
|
||||
│
|
||||
├── overlays/ # Package overlays
|
||||
│ └── default.nix
|
||||
│
|
||||
└── pkgs/ # Custom packages
|
||||
└── default.nix
|
||||
```
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
**On macOS:**
|
||||
1. Install Nix: `sh <(curl -L https://nixos.org/nix/install)`
|
||||
2. Enable flakes by adding to `~/.config/nix/nix.conf`:
|
||||
```
|
||||
experimental-features = nix-command flakes
|
||||
```
|
||||
|
||||
**On NixOS:**
|
||||
Flakes should be enabled via this configuration.
|
||||
|
||||
### Configuration Steps
|
||||
|
||||
1. **Update your username and hostname:**
|
||||
- In `flake.nix`: Replace `your-username` and `your-hostname` in the configurations
|
||||
- In `home-manager/home.nix`: Update the username
|
||||
- In `darwin/configuration.nix` or `nixos/configuration.nix`: Update hostname and user settings
|
||||
|
||||
2. **Set your architecture** (macOS):
|
||||
- In `darwin/configuration.nix`, set `nixpkgs.hostPlatform` to either:
|
||||
- `"aarch64-darwin"` (Apple Silicon)
|
||||
- `"x86_64-darwin"` (Intel)
|
||||
|
||||
3. **Configure Git identity** (optional):
|
||||
- In `home-manager/development.nix`, uncomment and set:
|
||||
```nix
|
||||
userName = "Your Name";
|
||||
userEmail = "your.email@example.com";
|
||||
```
|
||||
|
||||
### Building & Activating
|
||||
|
||||
**On macOS (first time):**
|
||||
```bash
|
||||
# Build the darwin configuration
|
||||
nix build .#darwinConfigurations.your-hostname.system
|
||||
|
||||
# Activate it
|
||||
./result/sw/bin/darwin-rebuild switch --flake .#your-hostname
|
||||
```
|
||||
|
||||
**On macOS (subsequent builds):**
|
||||
```bash
|
||||
darwin-rebuild switch --flake .#your-hostname
|
||||
```
|
||||
|
||||
**On NixOS:**
|
||||
```bash
|
||||
sudo nixos-rebuild switch --flake .#your-hostname
|
||||
```
|
||||
|
||||
**Standalone home-manager** (if not using system integration):
|
||||
```bash
|
||||
home-manager switch --flake .#your-username@your-hostname
|
||||
```
|
||||
|
||||
## Key Features
|
||||
|
||||
### Platform-Aware Configuration
|
||||
|
||||
The configuration automatically detects the platform using `pkgs.stdenv.isDarwin` and `pkgs.stdenv.isLinux`:
|
||||
|
||||
- Home directory: Automatically uses `/Users/` on macOS, `/home/` on Linux
|
||||
- Platform-specific packages and services are conditionally enabled
|
||||
- Shared configuration in `common.nix` for consistent experience
|
||||
|
||||
### Modular Home-Manager
|
||||
|
||||
Your user environment is split into logical modules:
|
||||
|
||||
- **common.nix**: Basic tools everyone needs (git, ripgrep, etc.)
|
||||
- **development.nix**: Development tools (languages, IDEs, etc.)
|
||||
- **shell.nix**: Shell configuration (bash, zsh, fish, starship)
|
||||
- **terminal.nix**: Terminal applications (tmux, neovim, alacritty)
|
||||
- **linux.nix**: Linux-specific GUI apps and services
|
||||
- **darwin.nix**: macOS-specific apps and integrations
|
||||
|
||||
### Shared System Configuration
|
||||
|
||||
`common.nix` is imported by both NixOS and nix-darwin configurations, providing:
|
||||
|
||||
- Unified Nix settings (flakes, garbage collection, etc.)
|
||||
- Shared package overlays
|
||||
- Consistent nixpkgs configuration
|
||||
|
||||
### Easy to Extend
|
||||
|
||||
- Add new home-manager modules in `modules/home-manager/`
|
||||
- Add platform-specific modules in `modules/nixos/` or `modules/darwin/`
|
||||
- Add custom packages in `pkgs/`
|
||||
- Add overlays in `overlays/`
|
||||
|
||||
## Customization Tips
|
||||
|
||||
### Adding Packages
|
||||
|
||||
**User packages** (home-manager):
|
||||
Add to the appropriate module:
|
||||
- `home-manager/common.nix` for shared packages
|
||||
- `home-manager/linux.nix` for Linux-only
|
||||
- `home-manager/darwin.nix` for macOS-only
|
||||
- `home-manager/development.nix` for dev tools
|
||||
|
||||
**System packages**:
|
||||
Add to `common.nix` for shared system packages, or to the platform-specific config.
|
||||
|
||||
### Enabling Programs
|
||||
|
||||
Most programs can be enabled via home-manager:
|
||||
|
||||
```nix
|
||||
programs.firefox.enable = true;
|
||||
programs.vscode.enable = true;
|
||||
```
|
||||
|
||||
Check [home-manager options](https://nix-community.github.io/home-manager/options.html) for available programs.
|
||||
|
||||
### Multiple Machines
|
||||
|
||||
Add more configurations in `flake.nix`:
|
||||
|
||||
```nix
|
||||
darwinConfigurations = {
|
||||
macbook = darwin.lib.darwinSystem { ... };
|
||||
mac-mini = darwin.lib.darwinSystem { ... };
|
||||
};
|
||||
|
||||
nixosConfigurations = {
|
||||
desktop = nixpkgs.lib.nixosSystem { ... };
|
||||
laptop = nixpkgs.lib.nixosSystem { ... };
|
||||
};
|
||||
```
|
||||
|
||||
### macOS System Defaults
|
||||
|
||||
The darwin configuration includes sensible defaults for macOS. Customize in `darwin/configuration.nix`:
|
||||
|
||||
- Dock behavior
|
||||
- Finder settings
|
||||
- Keyboard settings
|
||||
- Global domain defaults
|
||||
|
||||
## Maintenance
|
||||
|
||||
**Update flake inputs:**
|
||||
```bash
|
||||
nix flake update
|
||||
```
|
||||
|
||||
**Garbage collect old generations:**
|
||||
```bash
|
||||
# This happens automatically every 7 days, but you can run manually:
|
||||
nix-collect-garbage -d
|
||||
|
||||
# On NixOS:
|
||||
sudo nix-collect-garbage -d
|
||||
```
|
||||
|
||||
**View generations:**
|
||||
```bash
|
||||
# On macOS:
|
||||
darwin-rebuild --list-generations
|
||||
|
||||
# On NixOS:
|
||||
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
|
||||
```
|
||||
|
||||
**Rollback to previous generation:**
|
||||
```bash
|
||||
# On macOS:
|
||||
darwin-rebuild --rollback
|
||||
|
||||
# On NixOS:
|
||||
sudo nixos-rebuild --rollback
|
||||
```
|
||||
|
||||
## Resources
|
||||
|
||||
- [Nix Documentation](https://nixos.org/manual/nix/stable/)
|
||||
- [NixOS Options Search](https://search.nixos.org/options)
|
||||
- [Home Manager Options](https://nix-community.github.io/home-manager/options.html)
|
||||
- [nix-darwin Options](https://daiderd.com/nix-darwin/manual/index.html)
|
||||
- [Nix Language Basics](https://nixos.org/manual/nix/stable/language/)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**"error: experimental Nix feature 'flakes' is disabled"**
|
||||
- Enable flakes in your nix configuration
|
||||
|
||||
**Build fails on macOS**
|
||||
- Ensure nix-darwin is properly installed
|
||||
- Check that your architecture is set correctly in `darwin/configuration.nix`
|
||||
|
||||
**Home manager conflicts**
|
||||
- If you have existing dotfiles, back them up before applying home-manager
|
||||
- Use `home-manager switch --backup-extension .backup` to preserve existing files
|
||||
|
||||
**"collision between" errors**
|
||||
- Usually means packages are providing the same files
|
||||
- Check for duplicate package installations in system vs home-manager
|
||||
|
||||
## Contributing
|
||||
|
||||
Feel free to customize this configuration to your needs! The modular structure makes it easy to:
|
||||
- Add new feature modules
|
||||
- Share modules between machines
|
||||
- Contribute modules back to the community
|
||||
|
||||
Reference in New Issue
Block a user