npm package binary directory

TL;DR: process.cwd() will return the directory of the running process; __dirname will return the directory of the actual file.


I was working on an npm package executable and I wanted to know the directory of the package as well as the project.


Create the following directories:

$ mkdir a/ b/

a will contain your app project and b will contain your npm package binary.


Enter directory b:

$ cd b/

Initialize the package.json:

$ npm init -y

Create your script:

$ touch script.js

Add the following code to your script:

#!/usr/bin/env node

console.log('process.cwd():', process.cwd());
console.log('__dirname:', __dirname);
console.log('__filename:', __filename);
console.log('process.mainModule:', process.mainModule);

Set the bin field in package.json:

  "name": "b",
  "bin": "script.js"

Symlink your package:

$ npm link

/usr/local/bin/b -> /usr/local/lib/node_modules/b/script.js
/usr/local/lib/node_modules/b -> /Users/remarkablemark/b


Enter directory a:

$ cd ../a/

Install b as a symlink:

$ npm link b
/Users/remarkablemark/a/node_modules/b -> /usr/local/lib/node_modules/b -> /Users/remarkablemark/b

When you execute the binary:

$ npx b # yarn b

You’ll get the output:

process.cwd(): /Users/remarkablemark/a
__dirname: /Users/remarkablemark/b
__filename: /Users/remarkablemark/b/script.js
process.mainModule: Module {
  id: '.',
  path: '/Users/remarkablemark/b',
  exports: {},
  parent: null,
  filename: '/Users/remarkablemark/b/script.js',
  loaded: false,
  children: [],
  paths: [


By executing binary b in directory a (via npm, npx, or yarn):

In other words, process.cwd() will return the root directory of the app, whereas __dirname will return the directory of the binary file.

Please support this site and join our Discord!