Composer - run scripts only in dev environment

To do the non-development environment update without triggering any scripts, use the --no-scripts command line switch for the update command:

php composer.phar update --no-scripts
                         ^^^^^^^^^^^^

By default, Composer scripts are only executed in the base package. So you could have one package for development and in the live environment make it a dependency of the live system.

Apart from that, I do not see any way to differentiate scripts automatically.


Introduction

Some of the answers are a bit brief and don't go into detail about the context in which this is done. I'd like to share some knowledge with whoever is still puzzled after reading the previous answers.

Determine the right option for you

First, take a moment to realise that you're effectively creating a different flow, specific for a certain environment (i.e. your development server/container). This is against any best practices, as it is generally prone to errors. Having said that, you can achieve what you want in several ways;

Not triggering any scripts (docs)

If on some environment you do not want to trigger any scripts, you can prevent this using the --no-scripts flag.

Documentation reads: --no-scripts: Skips execution of scripts defined in composer.json.

composer upgrade --no-scripts

This is especially useful when upgrading packages while your code is currently not working. It would also work if your only scripts are development and test-related.

Running one script separately (docs)

Simply run the specific command as needed:

composer run-script [--dev] [--no-dev] script

This is useful when you want to run a script only on specific occasions.

For example, on build systems that have to perform a certain script before running any tests; build systems offer configuration options to call custom scripts like the above.

Defining a condition in the command (docs)

Documentation reads: During a composer install or update process, a variable named COMPOSER_DEV_MODE will be added to the environment. If the command was run with the --no-dev flag, this variable will be set to 0, otherwise it will be set to 1.

An example could look like

"scripts": {
    "post-install-cmd": [
         "[ $COMPOSER_DEV_MODE -eq 0 ] || <your command>"
    ]
}

Personally i would say this is the recommended way if you are using containers.

Note: this does not work on windows, since it would need %COMPOSER_DEV_MODE%.

There are also packages (like scriptsdev by neronmoon) that help you achieve the same goal without having to type the above in all commands, using a dev-scripts section in the extra section in composer.json

Defining a condition in your PHP script (docs)

Call a PHP method, that checks your environment based on how your application already does this. You can even reuse this condition by combining it with the method above; "Defining a condition in the command".

"scripts": {
    "post-update-cmd": [
        "AppNameSpaceName\\YourClassName::methodName"
    ]
}

You can then go ahead and create the class, like so:

<?php

namespace AppNameSpaceName;

class YourClassName 
{
    methodName() {
         // do stuff
    }
}

In many modern frameworks there is already a mechanism present to determine the runtime environment of the application (Symfony way, Laravel way).

Yarn run (docs)

Since most PHP applications nowadays also transpile their javascript files, either NPM or Yarn would be installed. You can use the scripts section to run this part only on development machines/containers. For example:

yarn run dev-only-script

having a section in package.json

"scripts": {
    "dev-only-script": "rm some/folder && ln -s path/to/your/folder some/"
}

The point of this is would be to your composer.json clean. In yarn you could have scripts for dev-server, test and build.