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