Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using PHP Composer to develop a local package and then copy it on deploy

I've got a local PHP project (a website), and I want to use another project I've made (a tiny web framework) as a Composer package for the website project. I'm developing them in tandem, but want to keep them as separate projects; when I deploy the website, I want to use Composer to install the framework project as a package, just like I would with Guzzle or any other common Composer package.

The website project has the following composer.json:

{
    "repositories": [
        {
            "type": "path",
            "url": "/local/path/to/framework/package"
            "options": {
                "symlink": true
            }
        }
    ],
    "require": {
        "my/framework": "dev-master",
        "guzzlehttp/guzzle": "6.3.3"
    }
}

In /local/path/to/framework/package/composer.json I have:

{
    "name": "my/framework",
    "description": "A tiny framework.",
    "autoload": {
        "psr-4": {
            "MyFramework\\": "src"
        }
    }
}

I run php composer.phar update and it sets up a symlink to the framework package in my website project. If I update code in the framework, it's immediately available to the website code. This is great.

However, later on I want to deploy the website project to my web server. For a clean deployment, I have a deploy script that exports an archive copy of the appropriate branch of the website git repo, and then runs php composer.phar install to make sure all the proper packages are installed. With the above config, the deploy script creates a symlink to the framework package, which is obviously no good when the deployment artifact is zipped up and scp'd out to the web server.

If I remove the symlink option above, then I have to run php composer.phar update every time I make any changes in the framework package, which is irritating since I'm developing the packages in tandem. But then on deploy, the package is copied in, rather than being symlinked in; this is good for deploy, except it always copies in the master branch (because I specified dev-master in composer.json).

Is there a way to set up Composer so that I can have the convenience of a local symlinked package for development, but to let the deployment script get a clean copy of the framework package, without having to change composer.json every time I want to deploy?

I also tried changing the repository type to vcs instead of path, but then Composer clones the framework package repository, and I really don't need a clone of the repo in my local vendor/ tree, either during development or deployment. I just want to be able to have a symlinked tree (which gets me instant updates) during development, and have a clean package installed for deplotment.

I may have to resign myself to developing the framework project "properly," that is, as a Composer package that I tag with actual release version numbers, and then update my website project to use a specific version of when it comes time for a deployment. I still haven't figured out the easiest way to do that, though.

like image 517
dirtside Avatar asked Jan 28 '26 17:01

dirtside


1 Answers

You can use Composer Studio plugin.

It uses a separate file for configuration and allows you to have symlinks in development and a regular Composer install for prod deploy, without touching composer.json.

With it, your website composer.json will look like a regular file:

{
    "require": {
        "my/framework": "dev-master",
        "guzzlehttp/guzzle": "6.3.3"
    }
}

And with studio.json in the root of the project, with the following content:

{
    "version": 2,
    "paths": [
        "/local/path/to/framework/package"
    ]
}

you can tell the plugin where to locate my/framework. Studio will then symlink the packages from the provided paths.

To have a regular install, just remove or rename studio.json, remove the vendor folder and composer.lock file and run the install again when deploying.

like image 138
Edi Modrić Avatar answered Jan 30 '26 08:01

Edi Modrić



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!