Using Peer Dependencies With Local (file:../some-lib) Dependencies

monorepo, node.js, npm, peer-dependencies

Solution

How about adding the `--preserve-symlinks` flag? E.g.:

node --preserve-symlinks index.js 

Here's a link to the docs

Problem

I have a monorepo that has many micro-services in it. There are some library-type functions / classes that I want to make available to any micro-service that needs it. However, if that library package declares a peer dependency, the peer dependency is not found when running code from within the thing that depends on the library. Consider this repo structure: - lib - some-library (peerDepends on `foo`) - index.js (requires `foo`) - node_modules will be empty - services - some-service (depends on `foo`, and `some-library`) - index.js (requires `some-library`) - node_modules will have: - `foo` - `some-library` will be a symlink to `../../lib/some-library` When running `node services/some-service/index.js`, you'll get the error "Cannot find module 'foo'", emanating from `lib/some-library/index.js`. Presumably this happens because node is only looking at `lib/some-library/node_modules` and any `node_modules` folder that is in an ancestor directory. But since this code was run from `services/some-service` (as the working directory), and because of the symlink in `services/some-service/node_modules`, I would've expected this to work. Here's a repo you can easily clone to see the problem: https://github.com/jthomerson/example-local-dependency-problem ``` git clone git@github.com:jthomerson/example-local-dependency-problem.git cd example-local-dependency-problem cd services/some-service npm install node index.js ``` I only see two solutions: - Don't use peerDependencies inside the library - Install each peer dependency at the root of the project for the sake of local development and testing. Neither of those is a real great solution because it doesn't allow each service to have different versions of the dependencies, and thus means that if the local version (or the library's version) of a dependency is bumped, all services that uses the library then have their dependencies version bumped at the same time, which makes them more brittle because they're all tied together.

Original source