medikoo / es5-ext

ECMAScript extensions (with respect to upcoming ECMAScript features)
ISC License
174 stars 85 forks source link

Postinstall broken for pnpm 7+ #143

Closed canadaduane closed 2 years ago

canadaduane commented 2 years ago

I've been messing around with this for a few hours. One of my dependencies (or sub-deps) includes es5-ext. When using pnpm (I'm using version 7.0.0-rc.2), the postinstall always fails with the following:

node_modules/.pnpm/es5-ext@0.10.60/node_modules/es5-ext: Running postinstall script...
 ELIFECYCLE  Command failed.

To replicate, install pnpm, then:

mkdir testproj
cd testproj
pnpm init
pnpm add es5-ext

OS: Linux (Pop!_OS 22.04) Nationality: Canadian

Note: I do not have node in my PATH.

medikoo commented 2 years ago

@canadaduane Thanks for reporting it. Still I've just tested it and installation worked without issues:

Screenshot 2022-04-09 at 09 47 38
canadaduane commented 2 years ago

Do you have node in your PATH?

matthijs-oosterhoff commented 2 years ago

I'm running into a similar issue. I have a a Docker image with a build environment for some legacy application. The Docker image installs gulp-cli, which has a dependency on es5-ext. Building that Docker image recently started failing and I pinpointed the issue to the _postinstall.js of es5-ext. Below you'll find a Dockerfile to reproduce the issue. This is a stripped down version of the one I use for my legacy Gulp application. It just installs es5-ext on top of Node 10 / NPM 7 from NVM.

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y curl

ENV NVM_VERSION 0.39.1
ENV NODE_VERSION 10.22.1
ENV NPM_VERSION 7.24.0

RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v$NVM_VERSION/install.sh | bash \
    && chmod u+x /root/.nvm/nvm.sh \
    && . /root/.nvm/nvm.sh \
    && nvm install v$NODE_VERSION \
    && nvm use v$NODE_VERSION

ENV PATH="${PATH}:/root/.nvm/versions/node/v${NODE_VERSION}/bin"
RUN npm install -g npm@$NPM_VERSION

RUN npm install -g es5-ext

Output of docker build -t reproducer .:

(...)
Step 10/10 : RUN npm install -g es5-ext
 ---> Running in 3fd48e6dd463
npm notice 
npm notice New major version of npm available! 7.24.0 -> 8.6.0
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.6.0>
npm notice Run `npm install -g npm@8.6.0` to update!
npm notice 
npm ERR! code 127
npm ERR! path /root/.nvm/versions/node/v10.22.1/lib/node_modules/es5-ext
npm ERR! command failed
npm ERR! command sh -c  node -e "try{require('./_postinstall')}catch(e){}"
npm ERR! sh: node: command not found

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2022-04-11T09_41_12_866Z-debug.log
The command '/bin/sh -c npm install -g es5-ext' returned a non-zero code: 127

The error as mentioned in the debug.log:

(...)
112 verbose stack Error: command failed
112 verbose stack     at ChildProcess.proc.on (/root/.nvm/versions/node/v10.22.1/lib/node_modules/npm/node_modules/@npmcli/promise-spawn/index.js:64:27)
112 verbose stack     at ChildProcess.emit (events.js:198:13)
112 verbose stack     at maybeClose (internal/child_process.js:982:16)
112 verbose stack     at Socket.stream.socket.on (internal/child_process.js:389:11)
112 verbose stack     at Socket.emit (events.js:198:13)
112 verbose stack     at Pipe._handle.close (net.js:607:12)
113 verbose pkgid es5-ext@0.10.60
114 verbose cwd /
115 verbose Linux 5.4.0-107-generic
116 verbose argv "/root/.nvm/versions/node/v10.22.1/bin/node" "/root/.nvm/versions/node/v10.22.1/bin/npm" "i" "-g" "es5-ext"
117 verbose node v10.22.1
118 verbose npm  v7.24.0
119 error code 127
120 error path /root/.nvm/versions/node/v10.22.1/lib/node_modules/es5-ext
121 error command failed
122 error command sh -c  node -e "try{require('./_postinstall')}catch(e){}"
123 error sh: node: command not found
124 verbose exit 127

As far as I am aware, node is on the PATH in the container. See line 16 of the Dockerfile, as wel as:

root@40d8b784b511:/# echo $PATH
/root/.nvm/versions/node/v10.22.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.nvm/versions/node/v10.22.1/bin
root@40d8b784b511:/# which node 
/root/.nvm/versions/node/v10.22.1/bin/node

I noticed 122 error command sh -c node -e "try{require('./_postinstall')}catch(e){}" in the debug log, which seems like an attempt to prevent the political script from breaking builds if anything misbehaves. I think another fallback may need to be added. I have nothing against these political statements in open source projects, but IMHO they should not break existing configurations.

maddocnc commented 2 years ago

Same error.

npm ERR! command sh -c  node -e "try{require('./_postinstall')}catch(e){}"
npm ERR! sh: 1: node: Permission denied

Also using nvm.

Please consider something like this https://github.com/medikoo/es5-ext/pull/180

jordanambra commented 2 years ago

Also having this issue in a GitHub Action that installs the latest versions of serverless and serverless-python-requirements, which has a dependency of es5-ext.

medikoo commented 2 years ago

Sorry for the late response, I was on vacation last week.

I believe I've fixed that with v0.10.61 (just published). If you still see any issues please report .