Nx.dev & Mono repos

What is mono repo ?

A monorepo is a single repository containing multiple distinct projects, with well-defined relationships.

Advantages
There are a number of potential advantages to a monorepo over individual repositories:[3][11]

  • Ease of code reuse
    • Similar functionality or communication protocols can be abstracted into shared libraries and directly included by projects, without the need of a dependency package manager.
  • Simplified dependency management
    • In a multiple repository environment where multiple projects depend on a third-party dependency, that dependency might be downloaded or built multiple times. In a monorepo the build can be easily optimized, as referenced dependencies all exist in the same codebase.
  • Atomic commits
    • When projects that work together are contained in separate repositories, releases need to sync which versions of one project work with the other. And in large enough projects, managing compatible versions between dependencies can become dependency hell.[6] In a monorepo this problem can be negated, since developers may change multiple projects atomically.
  • Large-scale code refactoring
    • Since developers have access to the entire project, refactors can ensure that every piece of the project continues to function after a refactor.
  • Collaboration across teams
    • In a monorepo that uses source dependencies (dependencies that are compiled from source) teams can improve projects being worked on by other teams. This leads to flexible code ownership.

Limitation & Disadvantages

  • Loss of version information
    • Although not required, some monorepo builds use one version number across all projects in the repository. This leads to a loss of per-project semantic versioning.
  • Lack of per-project access control
    • With split repositories, access to a repository can be granted based upon need. A monorepo allows read access to all software in the project, possibly presenting new security issues.Note that there are versioning systems in which this limitation is not an issue. For example, when Subversion is used, it’s possible to download any part of the repo (even a single directory), and path-based authorization can be used to restrict access to certain parts of a repository.
  • More storage needed by default
    • With split repositories, you fetch only the project you are interested in by default. With a monorepo, you check out all projects by default. This can take up a significant amount of storage space. While all versioning systems have a mechanism to do a partial checkout, doing so defeats some of the advantages of a monorepo.

Why Nx.dev?

Nx is a build system with built-in tooling and advanced CI capabilities. It helps you maintain and scale monorepos, both locally and on CI.

Reference material:

My functional dev setup

Problem statement:

The expectation from my dev setup is:
a) It must support multiple projects in plug and play basis and switch over time from one project to another should be less.
b) It should be able to run two inter linked projects simultaneously with conflicting env requirements like python and java side
c) It should be able to support Web Application, Mobile Application and Desktop Application development

Solution:

This time I am looking for Docker based setup instead of VM i.e. Oracle Virtual Box based setup. I have used VirtualBox since 2007 for my dev setup to mimic the hosting environment which were generally an ubuntu sever or a rhel/ centos server, I generally share VM image with team members to reduce configuration issues within team. As start point, I have gone through multiple documentation, best practices specially Pluralsight courses like https://app.pluralsight.com/paths/skill/docker-fundamentals-for-developers and https://app.pluralsight.com/library/courses/docker-web-development to learn the Docker concept.

Below is my current machine configuration:

  • My HP Pavillion 15 Gaming laptop with lntel i5 8th gen, 256gb SSD and 16gb ram and latest Windows 11 Pro installed will act as host machine.
  • The basic technology stack support in host machine will Open JDK 11, Python 3 and NodeJS LTS.
  • The Nginx in host machine will be act as load balancer.
  • The browsers MS Edge, Google Chrome and Mozilla Firefox with latest version will be used for testing.
  • IntelliJ Idea community edition, MS VS code, and Notepad ++ will be used as development IDE. GIT for version control.