nodejs / corepack

Zero-runtime-dependency package acting as bridge between Node projects and their package managers
MIT License
2.31k stars 146 forks source link

[ Error ] - NixOS - Corepack/Pnpm Version Mismatch/Internal Error #416

Open byteshiva opened 4 months ago

byteshiva commented 4 months ago

Issue: When attempting to use Corepack with pnpm@9.0.0-alpha.5 on NixOS, the installation process encounters an error due to a version mismatch. This issue also arises when enabling Corepack, leading to an internal error related to symlink creation in a read-only file system.

Error Messages:

  1. During pnpm installation:

    $ corepack use pnpm@*
    
    ERR_PNPM_BAD_PM_VERSION This project is configured to use v9.0.0-alpha.5+sha256.9b9b9a4f189d3837e7cfcabed63ab7b4afa6844ed98c6e1705bd70d0d9bef60b of pnpm. Your current pnpm is v9.0.0
  2. While enabling Corepack:

    $ corepack enable
    
    Internal Error: EROFS: read-only file system, symlink '../lib/node_modules/corepack/dist/pnpm.js' -> '/nix/store/HIDDEN-HASH-CODE-nodejs-20.11.1/bin/pnpm'
    Error: EROFS: read-only file system, symlink '../lib/node_modules/corepack/dist/pnpm.js' -> '/nix/store/HIDDEN-HASH-CODE-nodejs-20.11.1/bin/pnpm'
    

Steps to Reproduce NodeJS Unstable Installation:

nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz -p nodejs

Steps to Reproduce:

  1. Run the following commands to install pnpm:

    corepack use pnpm@*
  2. Attempt to enable Corepack:

    corepack enable

Environment Information:

Expected Behavior: The installation of pnpm and enabling Corepack should proceed without version mismatches or errors related to read-only file systems.

Actual Behavior: Errors are encountered during the installation of pnpm, enabling Corepack

aduh95 commented 4 months ago

The read-only issue was addressed by https://github.com/nodejs/corepack/pull/244 specifically for the Nix-OS use case :) You could of course define your own nix expression to create a jumper script:

{ pkgs, nodejs }:

let
  pnpm-shim = pkgs.writeShellScriptBin "pnpm" "exec \"${pkgs.lib.getBin nodejs}/bin/node\" \"${pkgs.lib.getBin nodejs}/bin/corepack\" pnpm \"$@\"";

in pnpm-shim

The ERR_PNPM_BAD_PM_VERSION seems to be a PNPM bug, that error is not thrown by Corepack.

byteshiva commented 4 months ago

The read-only issue was addressed by #244 specifically for the Nix-OS use case :) You could of course define your own nix expression to create a jumper script:

Thanks,

I've written a blog on creating a custom pnpm script aka (jumper nix script) and integrating it with direnv.

blog - https://byteshiva.medium.com/using-nix-to-create-a-custom-pnpm-script-and-integrate-with-direnv-a31017232e8d