Rev-dep is designed to serve as a high-speed gatekeeper for your CI pipeline, ensuring your dependency graph remains lean and your architecture stays intact as you iterate.
Quick Setup
Add Rev-dep to your project’s scripts in package.json:
{
"scripts" : {
"check:deps" : "rev-dep config run" ,
"check:deps:verbose" : "rev-dep config run --list-all-issues" ,
"fix:deps" : "rev-dep config run --fix"
},
"devDependencies" : {
"rev-dep" : "^2.0.0"
}
}
Then in your CI configuration:
GitHub Actions
GitLab CI
CircleCI
Jenkins
name : Dependency Check
on :
pull_request :
push :
branches : [ main ]
jobs :
check-deps :
runs-on : ubuntu-latest
steps :
- uses : actions/checkout@v3
- uses : actions/setup-node@v3
with :
node-version : '18'
- run : npm ci
- run : npm run check:deps
Exit Codes
Rev-dep uses standard exit codes to communicate results to your CI system:
Exit Code Meaning 0All checks passed successfully 1One or more checks found issues >1Error occurred during execution
By default, Rev-dep will fail your CI pipeline (exit code 1) when it detects issues. This is the recommended behavior for enforcing code quality.
Override Exit Code
For specific commands that support it, you can force a zero exit code:
# These commands won't fail CI even if issues are found
rev-dep node-modules unused --zero-exit-code
rev-dep node-modules missing --zero-exit-code
The --zero-exit-code flag is useful during migration or for non-blocking checks, but should be used sparingly in production CI.
Rev-dep’s configuration approach provides massive performance advantages in CI environments:
Single Dependency Tree Builds one comprehensive dependency tree for all rules instead of multiple passes
Parallel Rule Execution Processes multiple rules simultaneously using all available CPU cores
Parallel Check Execution Runs all enabled checks within each rule in parallel
Optimized File Discovery Discovers files once and reuses across all checks
Rev-dep can execute a full suite of governance checks on a 500k+ LoC monorepo in approximately 500ms :
Comparison with Alternatives
Check Type Rev-dep Alternative Speedup Circular dependencies 289 ms dpdm-fast: 7061 ms 24x faster Unused exports 303 ms knip: 6606 ms 22x faster Unused files 277 ms knip: 6596 ms 23x faster Unused node modules 287 ms knip: 6572 ms 22x faster Missing node modules 270 ms knip: 6568 ms 24x faster
Written in Go : Eliminates the performance tax of Node-based analysis
Parallel processing : Utilizes all available CPU cores
Single-pass analysis : Builds dependency graph once and reuses it
Optimized algorithms : Custom-built for dependency analysis
10x-200x faster execution means significantly reduced CI costs and shorter developer wait times.
Configuration Strategies
Progressive Adoption
Start with non-breaking checks and gradually enable stricter rules:
{
"configVersion" : "1.6" ,
"rules" : [
{
"path" : "." ,
"prodEntryPoints" : [ "src/main.tsx" ],
"circularImportsDetection" : { "enabled" : true },
"unusedNodeModulesDetection" : { "enabled" : true }
}
]
}
Phase 2: Add Autofix Checks
{
"configVersion" : "1.6" ,
"rules" : [
{
"path" : "." ,
"prodEntryPoints" : [ "src/main.tsx" ],
"circularImportsDetection" : { "enabled" : true },
"unusedNodeModulesDetection" : { "enabled" : true },
"unusedExportsDetection" : {
"enabled" : true ,
"autofix" : true
},
"orphanFilesDetection" : {
"enabled" : true ,
"autofix" : true
}
}
]
}
Phase 3: Full Enforcement
{
"configVersion" : "1.6" ,
"rules" : [
{
"path" : "." ,
"prodEntryPoints" : [ "src/main.tsx" ],
"circularImportsDetection" : { "enabled" : true },
"unusedNodeModulesDetection" : { "enabled" : true },
"missingNodeModulesDetection" : { "enabled" : true },
"unusedExportsDetection" : { "enabled" : true , "autofix" : true },
"orphanFilesDetection" : { "enabled" : true , "autofix" : true },
"moduleBoundaries" : [
{
"name" : "ui-components" ,
"pattern" : "src/components/**/*" ,
"deny" : [ "src/api/**/*" ]
}
]
}
]
}
Monorepo Setup
For monorepos, create rules for each package:
{
"configVersion" : "1.6" ,
"conditionNames" : [ "import" , "default" ],
"rules" : [
{
"path" : "." ,
"followMonorepoPackages" : true ,
"prodEntryPoints" : [ "packages/*/src/index.ts" ]
},
{
"path" : "packages/frontend" ,
"followMonorepoPackages" : true ,
"prodEntryPoints" : [ "src/main.tsx" ],
"devDepsUsageOnProdDetection" : {
"enabled" : true ,
"ignoreTypeImports" : true
}
},
{
"path" : "packages/backend" ,
"followMonorepoPackages" : true ,
"prodEntryPoints" : [ "src/server.ts" ],
"restrictedImportsDetection" : {
"enabled" : true ,
"entryPoints" : [ "src/server.ts" ],
"denyFiles" : [ "**/*.tsx" ],
"denyModules" : [ "react" , "react-*" ]
}
}
]
}
Run rev-dep config init at your monorepo root to automatically generate a rule for each workspace package.
Advanced CI Workflows
Pre-commit Hooks
Use with husky and lint-staged for faster feedback:
{
"lint-staged" : {
"*.{ts,tsx,js,jsx}" : [
"eslint --fix" ,
"rev-dep config run --fix"
]
}
}
Separate Check and Fix Jobs
check-deps :
runs-on : ubuntu-latest
steps :
- uses : actions/checkout@v3
- uses : actions/setup-node@v3
- run : npm ci
- run : npm run check:deps
Cache for Faster Builds
- uses : actions/cache@v3
with :
path : |
~/.npm
node_modules
key : ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
- run : npm ci
- run : npm run check:deps
Monitoring and Reporting
Verbose Output for Debugging
# Get detailed information about all issues
rev-dep config run --list-all-issues --verbose
Save Results to File
# Redirect output for artifact storage
rev-dep config run --list-all-issues > dependency-report.txt
Then in your CI:
- run : npm run check:deps:verbose > dependency-report.txt
continue-on-error : true
- uses : actions/upload-artifact@v3
if : always()
with :
name : dependency-report
path : dependency-report.txt
Best Practices
Start with detection
Enable checks in detection-only mode first to understand your codebase’s current state
Fix existing issues
Use --fix flag locally to auto-fix issues before enforcing in CI
Enable in CI
Add to CI pipeline once your codebase is clean
Monitor performance
Track CI execution time - Rev-dep should complete in under 1 second for most projects
Iterate on rules
Gradually add stricter rules (module boundaries, import conventions) as your architecture solidifies
Don’t skip checks with --zero-exit-code in production CI. If you need to bypass a specific check temporarily, disable it in the config instead.