hello i'm in new in monorepos world and i'm now searching about different monorepos tools and i found two intersting tools Nx(nrwl) and lerna but i didn't understand the real differnce between these two tools so any help and thanks
1 Answer
2022 Update
As pointed out by my great fellow at the comment section, Lerna is now being held by the Nx team.
The best solution nowadays is to use more native approaches for publishing (as NPM/YARN workspaces) or go straight to Nx.
Good references:
2021 Answer (slightly outdated but still valid)
Although both are great tools to work with mono repo, they're quite different in their purpose.
Differences
Lerna
is focused on linking multiple packages from the same project and managing npm publishing, and that's about it.
Nx
is more focused on managing development workflow for multiple packages. It means it can scaffold packages, and for every package, you can define configurations on how to run and build them, in a similar manner to Webpack.
Nx
can also work to spawn multiple processes at once. For example: run frontend and backend at the same time, without the need to open two different terminals. Similar to docker-compose.
Where they thrive
Lerna
fits better for open source projects with multiple packages (because you can easily publish your packages).
Nx
fits better for handling complex workflows with multiple packages.
How to choose
- If you don't intend to publish your packages,
Nx
might be a better fit. - If you do intend to publish then, but you don't have a complex workflow,
Lerna
is definitely the way to go. - If you want both (publish and complex workflow), neither one seems great, but you should probably choose
Nx
, and manage the publishing manually. Or, maybe, useLerna
and configure the workflow manually with Webpack.
Someone can wonder if you could choose both, but I don't think they can work well together. At the time I'm writing this, Nx
doesn't seem to care about being compatible with Lerna
, and it Nx
still lacks support for easy publishing.
An important disclaimer about terminology
- I used the name "package" here because "package" is what you can publish on the internet (for example, as npm is a node package manager).
Lerna
uses the name "project" as the wrapper folder of all your packages. Usually, a git repository is a "Lerna project" with several "Lerna packages".Nx
uses the name "project" to designate what Lerna calls "packages", and uses the name "workspace" to designate what Lerna calls "project" (i.e., the wrapper folder which holds all the projects).
-
7I recently opted for NX, and what really helped me with publishing was a plugin for NX: github.com/jscutlery/semver Commented Oct 27, 2021 at 6:42
-
2I decided to use lerna cause I want to create a monorepo for multiple dependencies that are going to be used in different projects Commented Mar 29, 2022 at 16:18
-
1According to NX doc, it can work with Lerna. See this: nx.dev/migration/lerna-and-nx Commented Jun 19, 2022 at 2:35
-
1Lerna and NX are now managed by the same team. Its now possible to use both in projects blog.nrwl.io/lerna-is-dead-long-live-lerna-61259f97dbd9 Commented Jul 5, 2022 at 10:59
-
4Sorry to be so picky, but "NPM - Node Package Manager" is not correct. Check out the npm repo: github.com/npm/cli#is-npm-an-acronym-for-node-package-manager Commented Jul 18, 2022 at 7:49