Composer: how to use local symlinks for packages in development but Git versions in production

I have a project with a composer.json where some libraries are pulled from our GitLab:

"require": {
    "my/library": "1.0.0",
    "my/library-second": "1.2.1"
}

On production, this works fine — Composer fetches the packages from Git.

However, during development, I need to make changes to these libraries locally without creating a release. I want to use path repositories with symlink to my local folder.

The problems I face:

  • If I add local path repositories directly to the main composer.json, it breaks the production build.

  • Using replace or dev-master leads to conflicts with the fixed versions (1.0.0 / 1.2.1).

  • Ideally, I want a way to have a separate local composer.json or override only on the dev machine, so that:

  1. locally the packages are installed as symlinks,

  2. on production the stable Git versions are used,

  3. the main composer.json remains unchanged.

Question:

What is the proper way to structure Composer for this use case?

  • Is there a standard practice or common pattern to separate local and production Composer configuration, while keeping symlinks for local packages during development?

  • How do PHP projects usually handle local development with symlinks on packages without touching production composer.json?