Any defined npm script exexcuted by npm run
will look for executionable binaries from with
cd your_project
./node_modules/.bin
folder first. You can also see its full path via:
npm bin
These binaries are coming from your project's defined dependencies from the package.json
via npm install
.
npm run start
is hence euquivalent to running:
./node_modules/.bin/react-scripts start
When you try to run
react-scripts start
on its own, you terminal will only look up your system's PATH
and try to find it there.
echo $PATH
So if you have react-scripts
only installed locally and not globally, it won't find the executable binary, and hence fail.
If you want to run it globally, you have to install it globally:
npm install -g react-scripts
which react-scripts
~/.nvm/versions/node/v7.10.0/bin/react-scripts //
and ~/.nvm/versions/node/v7.10.0/bin
is part of my PATH.
Sidenotes:
I prefer having each project define its own dependencies with their specific version locally and only use that. As you might have multiple projects dependending on different version of a binary.
And if you consistently use the one defined in the package.json
, you won't run into problems.
It also prevents "works on my machine" problems with co-workers when your npm script consistently rebuilds the state.
With npm it's a bit messy as you either define all the dependencies libraries you want to use in the npm scripts, or you have to run each command like:
$(npm bin)/yourCmd
Since I also like using yarn
as my npm replacement, I grew fond of its default to always look into the project's bin folder in order to execute a cmd via:
yarn yourCmd
$ "/home/philipp/my-project/node_modules/.bin/yourCmd"