Shell.nix for hugo + postcss

Hello,

I currently try to write a shell.nix to provide a development environment for hugo with the ability to do postcss processing.

I tried it with

{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  name = "commands-nix";

  buildInputs = [
    pkgs.hugo
    pkgs.nodePackages.postcss-cli
  ];
}

But executing postcss manually already fails.

$ postcss
internal/modules/cjs/loader.js:905
  throw err;
  ^

Error: Cannot find module 'postcss'
Require stack:
- /nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/index.js
- /nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/bin/postcss
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
    at Function.Module._load (internal/modules/cjs/loader.js:746:27)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:92:18)
    at Object.<anonymous> (/nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/index.js:14:17)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:14)
    at Module.require (internal/modules/cjs/loader.js:974:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/index.js',
    '/nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/bin/postcss'
  ]
}

I also tried to set NODE_PATH

$ NODE_PATH=/nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules postcss
internal/modules/cjs/loader.js:905
  throw err;
  ^

Error: Cannot find module 'postcss'
Require stack:
- /nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/index.js
- /nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/bin/postcss
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
    at Function.Module._load (internal/modules/cjs/loader.js:746:27)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:92:18)
    at Object.<anonymous> (/nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/index.js:14:17)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:14)
    at Module.require (internal/modules/cjs/loader.js:974:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/index.js',
    '/nix/store/x9znavbpi62dxlhiqfpsqn7xal1yvik1-node_postcss-cli-8.3.1/lib/node_modules/postcss-cli/bin/postcss'
  ]
}

Any ideas how generate a valid shell.nix?

2 Likes

Just for someone trying to accomplish the same thing

used node2nix to create nix files based on package.json

nix-shell -p nodePackages.node2nix
node2nix -i package.json --development

Then modify shell.nix

{ pkgs ? import <nixpkgs> {}}:

let
  nodeEnv = pkgs.callPackage ./node-env.nix { };
  nodePackages = pkgs.callPackage ./node-packages.nix {
    globalBuildInputs = with pkgs; [ hugo ];
    inherit nodeEnv;
  };
in nodePackages.shell
1 Like