nixpkgs is a treasure
Nix and NixOS continue to be the best way to manage and build software that I've found. Every project has a shell.nix
file in the root where I can define the specific software needed to work on that project along with any necessary environment variables or $PATH
modifications. I ran into an issue this week though where I needed an "old" version of Go (1.20
) but the version had already been removed from nixpkgs
. How can I pull in an "unlisted" version into my shell.nix
?
It's actually pretty straightforward, utilize fetchTarball
to pull in nixpkgs
based on a commit where the version was present sometime in the past. You can mix that import
in with regular/"current" packages with no issue like so:
{ pkgs ? import <nixpkgs> {} }: let oldGo = import (builtins.fetchTarball { url = "https://github.com/NixOS/nixpkgs/archive/33c51330782cb486764eb598d5907b43dc87b4c2.tar.gz"; sha256 = "sha256:0nflmpfp3pk704vhlvlgh5vgwl8qciqi18mcpl32k79qjziwmih8"; }) {}; in pkgs.mkShell { buildInputs = [ oldGo.go_1_20 pkgs.gopls pkgs.nodejs_18 ]; hardeningDisable = [ "fortify" ]; shellHook = '' mkdir -p .go .npm export GOPATH=$PWD/.go export NODE_PATH=$PWD/.npm export NPM_CONFIG_PREFIX=$NODE_PATH export PATH=$PWD/.yarn/sdks/typescript/bin:$PWD/.go/bin:$PATH:$NODE_PATH/bin ''; }
Notice I can reference the "nixpkgs
" tarball/snapshot, oldGo
, and pull in the version of Go I need?! nixpkgs
is such a treasure trove of software, it's absolutely incredible!