PHPackages                             shipmonk/modulint - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. shipmonk/modulint

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

shipmonk/modulint
=================

Enforce architecture by defining modules with allowed dependencies. Detects forbidden, uncovered, missing and unused module dependencies in PHP projects.

0.1.0(1mo ago)02.4k↓26.3%MITPHPPHP ^8.1CI passing

Since Jun 1Pushed 1mo agoCompare

[ Source](https://github.com/shipmonk-rnd/modulint)[ Packagist](https://packagist.org/packages/shipmonk/modulint)[ RSS](/packages/shipmonk-modulint/feed)WikiDiscussions master Synced 1w ago

READMEChangelogDependencies (12)Versions (4)Used By (0)

Modulint - module dependency enforcer for PHP
=============================================

[](#modulint---module-dependency-enforcer-for-php)

- 🧱 **Module-aware:** define modules over your codebase and declare which other modules each one may depend on
- 🚦 **Strict:** detects forbidden, uncovered, missing and unused module dependencies
- 🪶 **Lightweight:** single static analysis pass over your sources
- ⚙️ **Configurable:** pure PHP config, modules identified by your own enum
- ✨ **Compatible:** PHP 8.1+

Why?
----

[](#why)

Once a codebase grows, hand-written rules like "the `Logging` module must not depend on `Doctrine`" tend to drift. `shipmonk/modulint` lets you declare those rules as data and enforce them in CI.

A *module* is a named bag of paths (files and/or directories). For each module you declare which other modules it is allowed to depend on. Modulint walks every PHP file in each module, parses it, resolves used class-like symbols (classes, interfaces, traits, enums) via Composer's autoloader, looks up which module they belong to, and reports:

- **Forbidden dependency** — module `X` uses a class belonging to module `Y`, and `Y` is not in `X`'s allowed dependencies.
- **Uncovered dependency** — module `X` uses a class that is not part of any declared module.
- **Missing module** — a file inside a "fully-modulized" directory is not covered by any module.
- **Unused dependency** — module `X` declares a dependency on module `Y` but never actually uses anything from it.

Installation
------------

[](#installation)

```
composer require --dev shipmonk/modulint
```

Usage
-----

[](#usage)

Create `modulint.php` in your project root:

```
