问题
I'm relatively new to Node development and I'm trying out various modules, frameworks, etc.. I'm on macOS Catalina. I've changed my NPM root and $PATH while trying to get things to work, and I think I broke something, though I'm not exactly sure what. My issue is very specifically with NPM, which is having a persistent problem running installed modules both locally and globally. When I try to install a dev tool like Nodemon or a framework like Electron, I get error codes like:
sh: electron: command not found
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! electron-quick-start@1.0.0 start: `electron .`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the electron-quick-start@1.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
I've consulted a lot of resources and a lot of questions on this site, but I'm not experienced enough to accurately troubleshoot this issue and identify what's going on. While I'm shooting in the dark, I may be fixing one thing and breaking another, so I'm coming here to see if I can get a comprehensive answer.
I'll add that I've found a few workarounds, if this makes the issue clearer at all. I can get some modules (in this example Nodemon) to run by adding this "dev" script to the package.json:
"scripts": {
"dev": "node ./node_modules/.bin/nodemon server.js"
}
So I can access local project modules by specifying the path of the Module, but I can't just say "nodemon server.js", either in the dev script or from the command line, where it should have been installed globally. If I look in the specified npm -g root
folder, the packages I'm trying to run are definitely in there, so it's not an installation issue.
Any guidance y'all have is greatly appreciated, as I don't know what to make of all this.
回答1:
There are 2 installation style, local and global, on npm.
It is highly recommended to not mix both on the same environment, at least for a given module.
Global installation
e.g. npm install -g <module name>
The executable(s) provided by the module you have installed will be added into the place which PATH
environment variable includes.
You can then use this command everywhere (here electron
or nodemon
), but you cannot use different versions for each project in your environment. You can isolate this behavior with nvm
, or better in a container.
Local installation
e.g. npm install --save <module name>
The executable(s) will be installed into the project node_modules
directory and saved in the package.json
.
You can then use different versions of the module for each project and easily manage it with package.json
.PATH
environment variable does not include there, so you have to use ./node_modules/.bin/<command>
, as you did in your workaround, or $(npm bin)/<command>
.
You can also use any command provided by the module in npm-scripts even if it's a local install because npm
adds ./node_modules/.bin
to PATH
before npm run-script
command.
See also: https://docs.npmjs.com/cli/v7/commands/npm-run-script
来源:https://stackoverflow.com/questions/61921486/how-to-fix-sh-command-not-found-for-npm-modules