NPM : how to source ./node_modules/.bin folder?

2019-04-04 21:54发布

I have a problem on npm installation

I have created a project say project A

cd ~/projectA
npm install sails

but sails command is not found after installation.

I know that it is successfully install in ~/projectA/node_modules directory. but the executable cannot be sourced. And i know it is installed ~/projectA/node_modules/.bin

How can I source the .bin automatically whenever I enter into this projectA folder?

Did I did something wrong?

7条回答
Bombasti
2楼-- · 2019-04-04 22:18

To use on the command line like sails generate foo you will need to install the npm module globally.

npm install -g sails

You could also use the path to the bin in the command if you don't want to install globally:

./node_modules/sails/bin/sails.js generate foo
查看更多
戒情不戒烟
3楼-- · 2019-04-04 22:20

The official instructions for sails (https://github.com/balderdashy/sails) advises

To install the latest stable release with the command-line tool:

sudo npm -g install sails

This installs globally and adds to a directory like /usr/local/bin that should be in your $PATH.

But to answer the general question regarding the location of the binaries if you install locally, they should be placed in ./node_modules/.bin directory (so run ./node_modules/.bin/sails ...)

查看更多
聊天终结者
4楼-- · 2019-04-04 22:21

If you don't like to mess up with your PATH for running a npm script that isn't global -- e.g. you are the only one to use it --, I would personally recommend the use of an sh "alias".

  1. npm install (locally) your beloved package (json-diff here, for instance)

    cd ~ && npm install json-diff
    
  2. alias it (save it in your ~/.xxxxrc file):

    alias diffj "\`npm bin\`/json-diff !*"
    

Then, for diffing 2 json's:

diffj old.json new.json
查看更多
对你真心纯属浪费
5楼-- · 2019-04-04 22:22

In my ~/.bashrc, I have the following:

function nbin {
  local dir;
  dir=$(npm bin)
  if [ -d "$dir" ]; then
    ( # subshell to not change this shell's $PATH
      PATH=$dir:$PATH
      eval "$@"
    )
  else
    echo "\"$dir\" is not an npm binary directory." >&1
    return 1
  fi
}

I can then run executable foo in the .bin directory as:

nbin foo
查看更多
女痞
6楼-- · 2019-04-04 22:24

You should use the npm bin command to get an absolute path to your current node bin directory.

For example:

➤ lessc
bash: lessc: command not found
➤ npm bin
/home/brice/[...]/node_modules/.bin
➤ export PATH=$(npm bin):$PATH
➤ lessc --version
lessc 1.7.3 (Less Compiler) [JavaScript]

This avoids the problem of relative paths, especially if you're going to be using this in a build system that will invoke the command in subdirectories.

查看更多
不美不萌又怎样
7楼-- · 2019-04-04 22:34

I can give you an inelegant solution, which is working for me. I just exported my path in my .bashrc file.

export PATH="$PATH:./node_modules/.bin"

Edit: It's been a while, but I have changed my strategy to use npm scripts instead. In the above case, setup package.json as follows:

"scripts": {
    "sails": "sails"
}

Which you can then run with

npm run sails

or with arguments

npm run sails -- <args>
查看更多
登录 后发表回答