Dynamic composer.json Automation Solutions

Managing dependencies with Composer is essential in modern PHP projects, but maintaining a composer.json file directly has serious drawbacks.

  • Inflexibility -- Hard-typing every requirement into raw JSON quickly becomes unmanageable, especially in larger projects.
  • Error-prone -- JSON syntax errors are easy to make and can break builds.
  • Private repositories -- If you host your own packages without Private Packagist, you have to repeatedly specify long repository URLs in composer.json "repositories" section.

For teams with many custom packages, this becomes a bottleneck.

That is where automation comes in. Instead of treating composer.json as a static file, you can describe your dependencies in a higher-level PHP configuration and let scripts generate the final composer.json dynamically.

My Approach

I design systems that make Composer dependency management easier, safer, and more flexible:

  • Higher-level config -- Instead of JSON, dependencies are defined in PHP arrays. This allows nesting, grouping, and better readability.
  • Automated builds -- Scripts process the PHP config into a valid composer.json, so syntax issues are eliminated and formatting is consistent.
  • Private repository support -- A structured naming convention for your private packages means repository URLs are generated automatically. You no longer need to manually maintain them in composer.json.
  • Consistency checks -- Automated validation ensures that composer.json is always up to date with the higher-level config, avoiding drift.

Example

Instead of static composer.json:

{
  "name": "mycompany/myproject",
  "require": {
    "mycompany/checkout": "^1.4",
    "mycompany/session": "^1.0",
    "mycompany/utid": "^2.0"
  },
  "repositories": [
    {
      "type": "vcs",
      "url": "https://git.mycompany.com/checkout"
    },
    {
      "type": "vcs",
      "url": "https://git.mycompany.com/session"
    },
    {
      "type": "vcs",
      "url": "https://git.mycompany.com/utid"
    }
  ]
}

You maintain a custom composerConfig.php:

return [
    "name" => "mycompany/myproject",
    "vendorBaseUrls" => [
        "mycompany" => "https://git.mycompany.com/",
    ],
    "require" => [
        "mycompany" => [
            "checkout" => "^1.4",
            "session" => "^1.0",
            "utid" => "^2.0",
        ],
    ],
];

Then you build composer.json from composerConfig.php dynamically.

Why Automate Composer?

  • Maintainability -- A clear, typed configuration makes it easier for teams to see what packages are required and why. You can also use standard PHP comments.
  • Scalability -- Adding, renaming, or reorganizing packages becomes simpler, especially when many custom packages are involved.
  • Reliability -- Automated generation removes human error and enforces consistency.
  • Flexibility -- Supports projects that combine public Packagist packages with large sets of private repositories.

What I Offer

Consulting and Setup

  • Evaluate whether Composer automation is right for your project.
  • Design a private repository structure and naming convention that makes sense for your needs.
  • Set up a higher-level configuration system and build scripts.

Custom Development

  • Implement the automation logic in PHP and shell scripts.
  • Add environment-specific build modes (dev, prod, CI/CD).
  • Provide tools to validate that your composer.json is always current.

Migration

  • Convert your existing static composer.json setup into a flexible automated system.
  • Integrate your private packages without requiring Private Packagist.

Why Work With Me?

  • Focused stack -- 15+ years PHP experience and following best practices.
  • Private repository expertise -- I have built and maintained systems that integrate dozens of custom packages into Composer.
  • Proven workflows -- The CMS powering this site uses the same approach for dependency management.
  • Maintainable solutions -- Clean, well-structured, and easy to adapt for future needs.

Get in Touch

If you are struggling with Composer maintenance or want to integrate private repositories more cleanly, contact me.