林子豪的 PKM
← 返回 Blog

nix

2 min read
nix

安装 nix shell

sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install) --daemon

nix-shell 临时使用某些 program

nix-shell -p program-you-like-to-use 就会进入一个 shell 是安装好 program-you-like-to-use 的.

也可以单独只跑一次, 然后退出

nix-shell -p program --run args

也可以提供多个 program 一起用

nix-shell -p git nodejs

program 都有哪些可以在 https://search.nixos.org/packages 上面搜索

执行的时候根据当前的 nix 版本可能会获取到不同的 program / package. 可以通过 -I 参数指定一个固定的版本.

目前用 nix-shell 来 setup 新的机器, 就不需要逐个安装 node java clojure zsh git docker 之类的了.

nix 项目级配置 (flake)

永久开启 flake (experimental)

mkdir -p ~/.config/nix

echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf

flake.nix 文件放项目根目录, 然后 nix develop 就能用, exit 回到普通 shell

{
  description = "Clojure/Java/Node.js development environment";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
        
        # 自定义 JDK 版本(可选:jdk8, jdk11, jdk17, jdk21)
        jdk = pkgs.jdk21;
      in
      {
        devShells.default = pkgs.mkShell {
          buildInputs = with pkgs; [
            # 版本控制
            git
            
            # Java 生态
            jdk
            maven
            clojure
            
            # Clojure 脚本
            babashka
            
            # Node.js (LTS)
            nodejs_20
            pnpm
            
            # 开发工具(可选)
            clj-kondo    # Clojure linter
            clojure-lsp  # LSP 语言服务器
            jql          # JSON 查询工具(bb 常用搭档)
          ];
          
          # 环境变量
          JAVA_HOME = "${jdk}/lib/openjdk";
          CLOJURE_CLI_DATA_DIR = "$HOME/.clojure";
          
          # 进入 shell 时执行
          shellHook = ''
            echo "🚀 Dev env loaded"
            echo "Java:   $(java -version 2>&1 | head -n1)"
            echo "Clojure: $(clojure -version 2>&1 | head -n1)"
            echo "BB:     $(bb --version)"
            echo "Node:   $(node --version)"
            
            # 确保 Clojure 工具链缓存目录存在
            mkdir -p ~/.clojure
          '';
        };
      }
    );
}

nix 项目级配置 (legacy)

在项目根目录创建 shell.nix, 直接 nix-shell 执行就会使用配置的内容.

exit 回到普通 shell

{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  buildInputs = with pkgs; [
    git
    jdk21        # 或 jdk17、jdk11,按需选择
    clojure
    babashka
    nodejs_20    # 或 nodejs_18,nix 支持多版本并行
  ];
  
  # 可选:环境变量设置
  JAVA_HOME = "${pkgs.jdk21}/lib/openjdk";
  
  # 可选:进入 shell 时自动执行的命令
  shellHook = ''
    echo "🚀 开发环境已加载"
    echo "Java: $(java -version 2>&1 | head -n1)"
    echo "Node: $(node --version)"
  '';
}

home manager

用 nix 来管理 .ssh .gitconfig .zshrc 之类的东西

安装 home manager

flake.nix 里面加相关的

 inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";

    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { nixpkgs, home-manager, ... }:
    let
      system = "x86_64-linux";  # 如果是 ARM 改成 aarch64-linux
      pkgs = nixpkgs.legacyPackages.${system};
    in {
      homeConfigurations."你的用户名" = home-manager.lib.homeManagerConfiguration {
        inherit pkgs;
        modules = [ ./home.nix ];
      };
    };

创建 home.nix

{ pkgs, ... }:

{
  home.username = "root";
  home.homeDirectory = "/root";
  home.stateVersion = "24.11";

  # 装软件
  home.packages = with pkgs; [
    git
  ];

  # Git 配置
  programs.git = {
    enable = true;
    settings.user.name = "jan";
    settings.user.email = "janmrlda@gmail.com";
  };

  # SSH 配置
  programs.ssh = {
    enable = true;
    enableDefaultConfig = false;
    matchBlocks = {
      "github.com" = {
        identityFile = "~/.ssh/id_ed25519";
        user = "git";
      };
    };
  };

  programs.home-manager.enable = true;
}

nix run home-manager/master -- switch --flake .#root