Dev environments for numerous languages based on Nix flakes [maintainer=@lucperkins]
				
			
		| .github | ||
| clojure | ||
| csharp | ||
| cue | ||
| dhall | ||
| elixir | ||
| elm | ||
| gleam | ||
| go | ||
| hashi | ||
| haskell | ||
| java | ||
| kotlin | ||
| latex | ||
| nickel | ||
| nim | ||
| nix | ||
| node | ||
| node-latest | ||
| ocaml | ||
| opa | ||
| php | ||
| protobuf | ||
| pulumi | ||
| purescript | ||
| python | ||
| ruby | ||
| rust | ||
| rust-toolchain | ||
| scala | ||
| shell | ||
| zig | ||
| .editorconfig | ||
| .envrc | ||
| .gitignore | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
Nix flake templates for easy dev environments
To initialize (where ${ENV} is listed in the table below):
nix flake init --template github:the-nix-way/dev-templates#${ENV}
Here's an example (for the rust template):
# Initialize in the current project
nix flake init --template github:the-nix-way/dev-templates#rust
# Create a new project
nix flake new --template github:the-nix-way/dev-templates#rust ${NEW_PROJECT_DIRECTORY}
How to use the templates
Once your preferred template has been initialized, you can use the provided shell in two ways:
- If you have 
nix-direnvinstalled, you can initialize the environment by runningdirenv allow. - If you don't have 
nix-direnvinstalled, you can runnix developto open up the Nix-defined shell. 
Available templates
| Language/framework/tool | Template | 
|---|---|
| Clojure | clojure | 
| C# | csharp | 
| Cue | cue | 
| Dhall | dhall | 
| Elixir | elixir | 
| Elm | elm | 
| Gleam | gleam | 
| Go | go | 
| Hashicorp tools | hashi | 
| Java | java | 
| Kotlin | kotlin | 
| LaTeX | latex | 
| Nickel | nickel | 
| Nim | nim | 
| Nix | nix | 
| Node.js | node | 
| OCaml | ocaml | 
| Open Policy Agent | opa | 
| PHP | php | 
| Protobuf | protobuf | 
| Pulumi | pulumi | 
| Purescript | purescript | 
| Ruby | ruby | 
| Rust | rust | 
| Scala | scala | 
| [Shell] | shell | 
| Zig | zig | 
Template contents
The sections below list what each template includes. In all cases, you're free to add and remove packages as you see fit; the templates are just boilerplate.
clojure
csharp
- dotnet sdk 7 (7.0.305)
 - omnisharp-roslyn
 - Mono 6.12.0.182
 - msbuild 16.10.1
 
cue
- Cue 0.5.0
 
dhall
- Dhall 1.41.2
 - dhall-bash
 - dhall-docs
 - dhall-json
 - dhall-lsp-server
 - dhall-nix
 - dhall-nixpkgs
 - dhall-openapi
 - dhall-toml
 - dhall-yaml
 
elixir
elm
gleam
- Gleam 0.30.0
 
go
- Go 1.20.5
 - Standard Go tools (goimports, godoc, and others)
 - golangci-lint
 
hashi
- Packer 1.8.6
 - Terraform 1.5.2
 - Nomad 1.4.6
 - Vault 1.13.3
 - nomad-autoscaler 0.3.6-dev
 - nomad-pack 0.0.1-techpreview.3
 - levant 0.3.2-dev
 - damon
 - Terragrunt 0.45.13
 - tflint 0.46.1
 
haskell
java
kotlin
latex
nickel
- Nickel 0.2.0
 
nim
nix
node
ocaml
- OCaml 4.14.1
 - Dune 3.9.1
 - odoc 2.2.0
 - ocamlformat 0.25.1
 
opa
- Open Policy Agent 0.54.0
 - Conftest 0.44.0
 
php
protobuf
pulumi
- Pulumi 3.72.1
 - Python 3.11.4
 - Go 1.20.5
 - Node.js 18.16.1
 - dotnet sdk 6
 - Java 19.0.1 and Maven 3.9.2
 - jq 1.6
 
purescript
- Purescript (purs) 0.15.9
 - Spago 0.21.0
 - purescript-language-server 0.17.1
 - purs-tidy 0.10.0
 
python
- Python 3.11.4
 - pip 23.0.1
 - Virtualenv 20.19.0
 
ruby
- Ruby 3.2.2, plus the standard Ruby tools (
bundle,gem, etc.) 
rust
- 
Rust, including cargo, Clippy, and the other standard tools. The Rust version is determined as follows, in order:
- From the 
rust-toolchain.tomlfile if present - From the 
rust-toolchainfile if present - Version 1.70.0 if neither is present
 
 - From the 
 - 
rust-analyzer 2023-07-10
 - 
cargo-audit 0.17.0
 - 
cargo-deny 0.12.1
 
scala
shell
- shellcheck 0.9.0
 
zig
- Zig 0.10.1
 
Code organization
All of the templates have only the root flake as a flake input. That root flake provides a common revision of Nixpkgs and flake-utils to all the templates.