PHP Composer: No Dev Mode that Sticks

2019-04-18 01:47发布

问题:

When you install or update a project with composer, you can tell it to skip the development related dependencies (tests, build tools, etc.) with the --no-dev flag

composer.phar update --no-dev

Without this flag, composer will always download the extra dependencies.

Is there any way (programmatically or otherwise) to tell composer to always skip the development dependencies? That is, is there anything real code that matches the pseudo code

//File: composer.json
//...
"no-dev":"true"
//...

回答1:

In short: no - not, yet.

Composer's default installation mode is to install development dependencies.

As far as i know, there is only the CLI option --no-dev and no config option.

It's possible to define a config section in the composer.json of a project, see https://getcomposer.org/doc/04-schema.md#config

But a quick glance at the source code revealed, that there is no configuration directive for this. https://github.com/composer/composer/blob/master/src/Composer/Config.php#L22

{
    "config": {
        "no-dev": "true"
    }
}

+1 for this idea. It could be a useful addition to the Config class.



回答2:

This was really annoying, so I finally wrote a simple bash script which asks about environment and run correct command:

#! /bin/bash

read -p "Which environment use to deploy: (P)roduction (T)est (D)ev? (p/t/d): " -n 1 -r
echo

if [[ $REPLY =~ ^[^PpTtDd]$ ]]; then
    echo "Incorrect environment";
    exit 1;
fi

# tasks to run before composer install (svn up/git pull)

if [[ $REPLY =~ ^[Pp]$ ]]; then
    composer install --prefer-dist --no-dev --classmap-authoritative
elif [[ $REPLY =~ ^[Tt]$ ]]; then
    composer install --prefer-dist --classmap-authoritative
elif [[ $REPLY =~ ^[Dd]$ ]]; then
    composer install
fi

# additional tasks after composer install (clear cache, migrations, etc.)

Saved it in bin/deploy in project and added execute permissions. So now I'm using bin/deploy instead of composer install:

I also put other common tasks there (pull changes from VCS, clear cache, run migrations, etc.), so I have even less things to do and remember during deployment :).