News for hackers. Stuff that matters.
Re:Monorepoize – Bash scripts for creating a monorepo out of... by edwintorok on Monday April 27, 2020 @04:33AM (#22994018)
Once your code grows and you end up with too many repos you'll be yearning to get back to monorepos. It allows to make changes in one go instead of having 3-4 PRs that all have to be merged at same time or otherwise the build breaks.

Having separate repos only makes sense if they are maintained by separate teams with a well defined API in-between that doesn't change often. If the same team maintains all repos then it is just overhead, especially if you end up with a 100 repos and you have significantly less than 100 engineers in your team.

There are also potential build time savings when having a monorepo since you can do parallel builds across different subdirs without serialising at package boundaries.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by cryptica on Monday April 27, 2020 @04:50AM (#22994100)
I maintain such a project with many dependencies which I also maintain separately. Yes it can be a lot of extra work to publish but this argument is based on the assumption that dependencies need to be changed constantly and this assumption is wrong. There should be pressure to design dependencies in such a way that they are modular and don't need to be changed often - This unpleasantness associated with updating deep dependencies is good and necessary. These should rarely be updated, if they need to be updated often, then they were designed incorrectly.

Many of the dependencies and sub-dependencies which I maintain are several years old. They are small enough and stable enough that they basically never need to change.

If I need to update them (which is rare), I may need to do a cascading update of multiple dependents and this can take a while but if I have to do this big update only once every 6 months, it's totally worth having them in separate repos.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by beagle3 on Monday April 27, 2020 @06:39AM (#22994597)
That depends on the scale of the project, of course - if you have thousands of engineers as MicroFaceGoog does, then it’a a daily, even hourly, occurrence for many dependencies.

You are not MicroFaceGood, of course, so you only do that every 6 months.

However, I what way are separate repos nicer for you? Personally, I settled on a monorepo with a “$dep-devel” branch for every dependency, which I occasionally have on multiple working trees out at the same time, and which I feel gives me all the benefit a multirepo could have (whatever they may be, I can’t find them) while still making tracking, branching and merging across dependencies trivial.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by stepbeek on Monday April 27, 2020 @05:01AM (#22994159)
> Having separate repos only makes sense if they are maintained by separate teams with a well defined API

Agree! I've found that a multirepo setup only works if there's an obvious boundary. Similar to SOA, distributed monoliths - or distributed monorepos - are problematic.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by cryptica on Monday April 27, 2020 @05:11AM (#22994220)
> Having separate repos only makes sense if they are maintained by separate teams with a well defined API

If some logic is modular then it should be in a separate repo. If it's not modular then it should be part of the same repo; just regular files inside directories... IMO, monorepos try to have it both ways but this doesn't make any sense; it encourages developers to write logic which is "somewhat modular".

But "somewhat modular" is not modular at all. Either it's modular and it can easily be extracted out completely or it's not and then it should be embedded into the project's code.

Code which is not modular should never need to be shared with other projects.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by _se on Monday April 27, 2020 @08:00AM (#22994987)
This is a ridiculous oversimplification that doesn't scale at all to larger orgs. Every modular component in its own repo? That basically means creating a repo for every library. You could easily be managing thousands of repos with negative benefit.

People seem to be afraid of using a single repo for some reason. It's really simple though. You should have one repo per "release cycle" that you have. Anything meant to be deployed together should be in the same repo. Things not meant to be deployed together should be in different repos. With the right tooling, that is what solves most problems.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by bluGill on Monday April 27, 2020 @08:23AM (#22995141)
I have two things that are not deployed together. However there is common algorithms between the two that I'd rather not copy and paste maintain. Mono repo doesn't make sense because there is always something close to release and getting risk adverse (there are legal consequences to some bugs) so nothing can every be updated.
Re:Monorepoize – Bash scripts for creating a monorepo out of... by wwright on Monday April 27, 2020 @08:59AM (#22995367)
The release cycle of that common code is also a big factor.

If your common code changes fairly irregularly, you are correct, monorepos have reduced benefit.

If your common code is as likely to change as anything else, or more likely, then your multirepo setup can begin to incur more cost.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by cryptica on Monday April 27, 2020 @08:41AM (#22995244)
>> Every modular component in its own repo

My original statement was slightly misleading. I meant to say "every modular component which needs to be reused by different projects" obviously I'm not advocating that every class should be in a separate repo; that would be madness. My point is; if it's modular and needs to be reused in different projects, then it should be a separate repo, otherwise, it can just be added as files inside the current project repo; no need to publish those as separate standalone libraries for download. If the component is not modular, then it shouldn't be shared with any other projects.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by kdumont on Monday April 27, 2020 @08:18AM (#22995096)
> It allows to make changes in one go instead of having 3-4 PRs that all have to be merged at same time or otherwise the build breaks.

Can't you solve this by pointing submodules in the parent repo to a specific commit SHA before the breaking change? Then update the pointer in parent repo when you've made the corresponding changes.

I understand it's still added work compared to a monorepo, but seems like this could be a controlled way to handle submodules when necessary.

Re:Monorepoize – Bash scripts for creating a monorepo out of... by stared on Monday April 27, 2020 @06:37AM (#22994588)
I saw some projects in which my instinct was "too many repos" (e.g. https://github.com/ActivityWatch/activitywatch), exactly for the reasons you mentioned.

However, in my case - as the project gets bigger, I appreciate it more. In the first place, it makes code reusable, and forces to encapsulated functionalities as much as possible. (Yes, having non-encapsulated code would be a nightmare).

To get to the extreme, in the Node ecosystem code is pretty much structured as many, many small packages. (Bear in mind, that turning something into a package is a much stricter requirement that making it effectively a subfolder.)