Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/nicojs/node-link-parent-bin

A tool to link the bins of the your npm dependencies to child packages in a node multi-package repository
https://github.com/nicojs/node-link-parent-bin

Last synced: about 2 months ago
JSON representation

A tool to link the bins of the your npm dependencies to child packages in a node multi-package repository

Awesome Lists containing this project

README

        

[![Mutation testing badge](https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2Fnicojs%2Fnode-link-parent-bin%2Fmaster)](https://dashboard.stryker-mutator.io/reports/github.com/nicojs/node-link-parent-bin/master)
![CI](https://github.com/nicojs/node-link-parent-bin/workflows/CI/badge.svg)

# Link parent bin

Link the bins of parent (dev) dependencies to the child packages in a multi-package [lerna](https://lernajs.io/)-like project. Stuff just works as expected.

**NOTE: This package is no longer needed and thus deprecated. Since recent NPM releases, any parent directory's "node_modules/.bin" is automatically added to the PATH when using `npm run`.**

## About

Let's say your repo looks like this:

```
root/
package.json
packages/
package-1/
package.json
package-2/
package.json
```

Well... you're probably managing your `devDependencies` at root level only. For example: you have one `mocha` installed at root with `npm i -D mocha`.

Now if you add an npm script in `package-1/package.json`:

```json
"scripts": {
"test": "mocha"
}
```

And run:

```bash
$ npm run test

> [email protected] test /package-1
> mocha

'mocha' is not recognized as an internal or external command

npm ERR!
```

...thats not so nice. You're basically forced to run all npm scripts from the root level. *But* after running `link-parent-bin`:

```bash
$ npm run test

> [email protected] test /package-1
> mocha

linked from parent...
√ and it worked!
```

## Getting started

Install the package in the **root** of your multiple packages repository.

```bash
npm i -D link-parent-bin
```

Add the following npm script in your root `package.json`:

```json
"scripts": {
"link-parent-bin": "link-parent-bin"
}
```

Run it with `npm run link-parent-bin`.

```bash
npm run link-parent-bin

[INFO] ParentBinLinker - Linking dependencies ["mocha"] under children ["package-1", "package-2"]
```

And your done.

## Improve your workflow

Since you're probably not releasing your parent module anyway, it might be better to add the linking to the post-install step:

```json
"scripts": {
"postinstall": "link-parent-bin"
}
```

*-or if you're using lerna*

```json
"scripts": {
"postinstall": "lerna bootstrap && link-parent-bin"
}
```

This way, other developers don't have to run this script manually.

## Command line options

```bash
$ node_modules/.bin/link-parent-bin --help

Usage: link-parent-bin [options]

Options:
-V, --version output the version number
-c, --child-directory-root The directory that hosts the child packages relative to the parent root. (default: "packages")
-d, --link-dev-dependencies Enables linking of parents `devDependencies`. Defaults to: true (default: true)
-s, --link-dependencies Enables linking of parents `dependencies`. Defaults to: false (default: false)
-o, --link-local-dependencies Enables linking of parents `localDependencies`. Defaults to: false (default: false)
-l, --log-level Set the log level (default: "info")
--filter Specify a [minimatch](https://www.npmjs.com/package/minimatch) glob pattern to specify which child packages under the child packages directory should receive symlinks. (default: "*")
-h, --help display help for command
```

## Use programmatically

```js
const { ParentBinLinker } = require('link-parent-bin');
const linker = new ParentBinLinker({ childDirectoryRoot: 'packages', linkDevDependencies: true, linkDependencies: false, linkLocalDependencies: false });
linker.linkBinsToChildren()
.then(() => console.log('done'))
.catch(err => console.error('Error Linking packages', err));
```

Type declaration files are included for the TypeScript developers out there.