Useful script to initialise flakes before running nix
#!/usr/bin/env bash
# Ensure Nix has flakes enabled
echo "Setting up Nix Flakes environment..."
if ! grep -q 'experimental-features = nix-command flakes' ~/.config/nix/nix.conf; then
echo "Enabling flakes support in Nix..."
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
else
echo "Flakes support is already enabled."
fi
# Reload Nix daemon
if command -v nix &> /dev/null; then
echo "Reloading Nix..."
nix-env --version
nix-channel --update
else
echo "Nix is not installed. Please install it first."
fi
echo "Nix environment for flakes is now set up."Go Dev flake
{
description = "Professional Go development environment with Nix flakes";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.simpleFlake {
inherit self nixpkgs;
name = "go-dev-env";
shell = { pkgs }: pkgs.mkShell {
buildInputs = with pkgs; [
# Go compiler and tools
go
gopls
go-tools
golangci-lint
# Build essentials
gcc
pkg-config
# Development tools
delve # Go debugger
air # Live reload for Go apps
];
# Set up Go environment variables
shellHook = ''
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$PATH
export GO111MODULE=on
export GOFLAGS="-mod=readonly"
# Print versions for verification
echo "Go Version: $(go version)"
echo "GCC Version: $(gcc --version | head -n 1)"
echo "Development environment ready!"
'';
};
};
}Python Dev flake
{
description = "Professional Python development environment with Poetry, linting, and testing";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.simpleFlake {
inherit self nixpkgs;
name = "python-dev-env";
shell = { pkgs }: pkgs.mkShell {
buildInputs = with pkgs; [
# Python and package management
python311
python311Packages.poetry
python311Packages.pip
python311Packages.virtualenv
# GNU Make for task automation
gnumake
# Linting & Formatting
python311Packages.black
python311Packages.isort
python311Packages.mypy
python311Packages.ruff
# Testing
python311Packages.pytest
python311Packages.pytest-cov
# Debugging
python311Packages.debugpy
python311Packages.ipdb
# Pre-commit hooks
python311Packages.pre-commit
# Utilities
python311Packages.rich # Rich formatting for debugging/logging
];
# Set up the environment
shellHook = ''
export VIRTUAL_ENV=$PWD/.venv
export PATH=$VIRTUAL_ENV/bin:$PATH
export POETRY_VIRTUALENVS_IN_PROJECT=true
# Ensure virtual environment is activated
if [ ! -d "$VIRTUAL_ENV" ]; then
echo "Creating virtual environment..."
poetry install
fi
source $VIRTUAL_ENV/bin/activate
# Display versions for verification
echo "Python Version: $(python --version)"
echo "Poetry Version: $(poetry --version)"
echo "Make Version: $(make --version | head -n 1)"
echo "Development environment ready!"
'';
};
};
}Elixir Dev flake
{
description = "Professional Elixir Phoenix development environment with Nix flakes";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.simpleFlake {
inherit self nixpkgs;
name = "elixir-phoenix-dev-env";
shell = { pkgs }: pkgs.mkShell {
buildInputs = with pkgs; [
# Elixir and Erlang/OTP
elixir_1_15
erlang_26
hex # Elixir package manager
rebar3 # Erlang build tool
elixir_ls # Language server for Elixir
# Phoenix Framework
nodejs_20
pnpm
postgresql # Optional, for dev database
# Development & Debugging
gnumake
inotify-tools # Required for LiveView & `mix phx.server`
# Linting & Static Analysis
elixirPackages.credo
elixirPackages.dialyxir
];
# Set up the environment
shellHook = ''
export MIX_ENV=dev
export PATH="$HOME/.mix/escripts:$PATH"
# Ensure Phoenix is installed
if ! mix phx.new --version &> /dev/null; then
echo "Installing Phoenix..."
mix archive.install hex phx_new --force
fi
# Ensure dependencies are installed
if [ ! -d "deps" ]; then
echo "Installing Elixir dependencies..."
mix deps.get
fi
# Ensure Node.js dependencies are installed
if [ -f "assets/package.json" ]; then
echo "Installing Node.js dependencies..."
cd assets && pnpm install && cd ..
fi
# Display versions for verification
echo "Elixir Version: $(elixir --version)"
echo "Erlang Version: $(erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell)"
echo "Node Version: $(node --version)"
echo "Phoenix Version: $(mix phx.new --version)"
echo "Development environment ready!"
'';
};
};
}
Java Dev flake
{
description = "Professional Java development environment with Maven, GraalVM, and debugging tools";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.simpleFlake {
inherit self nixpkgs;
name = "java-dev-env";
shell = { pkgs }: pkgs.mkShell {
buildInputs = with pkgs; [
# GraalVM 21+ (latest stable)
graalvm21-ce
maven # Build system
gradle # Optional, if you prefer Gradle
# Debugging & Profiling
jdk11 # Needed for JFR & Java Mission Control
jdk17 # Needed for modern compatibility
visualvm
openjdk21
jmc # Java Mission Control for profiling
# Linting & Code Quality
checkstyle
spotbugs
pmd
# Testing & Mocking
junit5
mockito
# Build & Automation
gnumake
];
# Set up the environment
shellHook = ''
export JAVA_HOME=${pkgs.graalvm21-ce}
export PATH=$JAVA_HOME/bin:$PATH
export MAVEN_OPTS="-XX:+UseG1GC -Xms512m -Xmx2g"
echo "Java Version: $(java -version)"
echo "Maven Version: $(mvn -version)"
echo "GraalVM Version: $(native-image --version)"
echo "Development environment ready!"
'';
};
};
}
Why always me?