The last few days I thought about the structure of the pucene project and the repositories.
Initial setup
Initially, I created lots of repositories:
- pucene/core
- pucene/elastic-bundle
- pucene/doctrine-bundle
- pucene/pucene
- pucene/docs
The idea behind it was to keep the repositories small and the structure of the project cleaner.
But in this complex structure, I lost myself by thinking about where does this piece of code belong to. So I decided after a long discussion with Thomas and Alex to restructure the whole project and create a monolithic repository which is much easier to maintain and extend in this early stadium of development.
The pull request #6 will merge all these repositories into a single monolithic repository.
Monolithic repositories
"We have a single large depot with almost all of Google's projects on it. This aids agile development and is much loved by our users since it allows almost anyone to easily view almost any code, allows projects to share code, and allows engineers to move freely from project to project. Documentation and data is stored on the server as well as code."
Dan Bloch, Google Inc. - Paper from 2011 and still practiced by google
So, monolithic repositories are all about moving fast and getting things done more efficiently. In other words, monolithic repositories increase developer productivity.
I will append two very good blog posts about the pros and cons of monolithic repositories. But because of the above-mentioned reason, I have decided to go this way.
Future
The new structure contains loosely coupled components and a single monolithic bundle which glues everything together and integrates it into Symfony. This will allow splitting these components into smaller repositories which can be used independently by any project (similar to Symfony components).
Current State
The current state contains a working prototype for elasticsearch which implements an interface which is designed to fulfill the minimum features of the first release. This interface will be implemented soon by raw PHP. The raw PHP implementation will allow the developer to switch smooth between the adapters without changing the code of the project.