web-dev-qa-db-fra.com

Composer - exécuter des scripts uniquement dans un environnement de développement

Voici mon fichier composer.json:

"require": {
    "php": ">=5.4",
    "zendframework/zendframework": "2.*",
    "doctrine/doctrine-module": "dev-master",
    "doctrine/doctrine-orm-module": "0.*",
    "gedmo/doctrine-extensions": "dev-master"
},
"require-dev": {
    "phpunit/phpunit": "3.7.*"
},
"scripts": {
    "post-update-cmd": [
        "rm -rf vendor/Behat",
        "git clone git://github.com/Behat/Behat.git",
        "cp composer.phar Behat/composer.phar",
        "cd Behat && git submodule update --init",
        "cd Behat && php composer.phar install",
        "cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
        "mv Behat vendor/Behat",
        "ln -sf ../Behat/bin/behat vendor/bin/"
    ]
}

Comment puis-je faire en sorte que les scripts ne soient exécutés que dans l'environnement de développement?

Fondamentalement, je veux que les scripts s'exécutent uniquement lorsque j'appelle:

php composer.phar update --dev
30
Richard Knop

Pour effectuer la mise à jour de l'environnement sans développement sans déclencher de script, utilisez le --no-scripts commutateur de ligne de commande pour la commande update :

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

Par défaut, les scripts Composer ne sont exécutés que dans le package de base. Vous pouvez donc avoir un package à développer et dans l'environnement live en faire une dépendance du système live.

En dehors de cela, je ne vois aucun moyen de différencier automatiquement les scripts.

42
hakre

Il n'est pas possible de choisir un script différent pour l'installation par défaut et l'option - dev mais vous pouvez utiliser la méthode isDevMode () dans Composer\Script\Event pour exécuter la commande uniquement dans un environnement de développement. http://getcomposer.org/apidoc/master/Composer/Script/Event.html

12
Christian Koch

Introduction

Certaines réponses sont un peu brèves et n'entrent pas dans les détails du contexte dans lequel cela se fait. Je voudrais partager certaines connaissances avec celui qui est toujours perplexe après avoir lu les réponses précédentes.

Déterminez l'option qui vous convient

Tout d'abord, prenez un moment pour vous rendre compte que vous créez effectivement un flux différent, spécifique à un certain environnement (c'est-à-dire votre serveur/conteneur de développement). Cela est contraire aux meilleures pratiques, car il est généralement sujet à des erreurs. Cela dit, vous pouvez réaliser ce que vous voulez de plusieurs façons;

Ne déclenchant aucun script ( docs )

Si, dans certains environnements, vous ne souhaitez pas déclencher de scripts, vous pouvez empêcher cela en utilisant le --no-scripts drapeau.

La documentation se lit comme suit: --no-scripts: Ignore l'exécution des scripts définis dans composer.json.

composer upgrade --no-scripts

Ceci est particulièrement utile lors de la mise à niveau de packages alors que votre code ne fonctionne pas actuellement. Cela fonctionnerait également si vos seuls scripts sont liés au développement et aux tests.

Exécution d'un script séparément ( docs )

Exécutez simplement la commande spécifique selon vos besoins:

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

Ceci est utile lorsque vous souhaitez exécuter un script uniquement à des occasions spécifiques.

Par exemple, sur des systèmes de build qui doivent exécuter un certain script avant d'exécuter des tests; les systèmes de build offrent des options de configuration pour appeler des scripts personnalisés comme ci-dessus.

Définition d'une condition dans la commande ( docs )

La documentation indique: Au cours d'un processus d'installation ou de mise à jour de composer, une variable nommée COMPOSER_DEV_MODE sera ajouté à l'environnement. Si la commande a été exécutée avec l'indicateur --no-dev, cette variable sera définie sur 0, sinon elle sera définie sur 1.

Un exemple pourrait ressembler

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

Personnellement, je dirais que c'est la manière recommandée si vous utilisez des conteneurs.

Remarque: cela ne fonctionne pas sur Windows, car il faudrait %COMPOSER_DEV_MODE%.

Il existe également des packages (comme scriptsdev by neronmoon ) qui vous aident à atteindre le même objectif sans avoir à taper ce qui précède dans toutes les commandes, en utilisant un dev-scripts section dans la section extra dans composer.json

Définition d'une condition dans votre PHP ( docs )

Appelez une méthode PHP, qui vérifie votre environnement en fonction de la façon dont votre application le fait déjà. Vous pouvez même réutiliser cette condition en la combinant avec la méthode ci-dessus; "Définir une condition dans la commande".

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

Vous pouvez ensuite continuer et créer la classe, comme ceci:

<?php

namespace AppNameSpaceName;

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

Dans de nombreux frameworks modernes, il existe déjà un mécanisme pour déterminer l'environnement d'exécution de l'application ( façon Symfony , façon Laravel ).

Parcours de fil ( docs )

Étant donné que la plupart des applications PHP de nos jours transposent également leurs fichiers javascript, NPM ou Yarn seraient installés. Vous pouvez utiliser la section des scripts pour exécuter cette partie uniquement sur des machines/conteneurs de développement. Par exemple:

yarn run dev-only-script

avoir une section dans package.json

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

Le but de ceci serait de nettoyer votre composer.json. En fil, vous pourriez avoir des scripts pour dev-server, test et build.

7
Webber

Vous pouvez utiliser la variable d'environnement COMPOSER_DEV_MODE (nouveau dans la version 1.3.0-RC - 2016-12-11):

"scripts": {
    "post-install-cmd": [
        "[ $COMPOSER_DEV_MODE -eq 0 ] || echo devmode only"
    ]
},
6
Veda

Vous pouvez obtenir le même effet en configurant un script personnalisé pour la voie de développement, au lieu d'utiliser le post-update-cmd crochet.

"scripts": {
    "update-behat": [
        "rm -rf vendor/Behat",
        "git clone git://github.com/Behat/Behat.git",
        "cp composer.phar Behat/composer.phar",
        "cd Behat && git submodule update --init",
        "cd Behat && php composer.phar install",
        "cd Behat && php composer.phar require guzzle/guzzle:3.0.*",
        "mv Behat vendor/Behat",
        "ln -sf ../Behat/bin/behat vendor/bin/"
    ],
    "dev-update": [
        "@composer update --dev",
        "@update-behat"
    ]
}

Ensuite, exécutez simplement php composer.phar dev-update

6
Ali Gangji

Voici le petit package que vous pouvez utiliser pour ce faire https://github.com/neronmoon/scriptsdev Il ajoute la possibilité de définir des scripts uniquement pour les développeurs. usage

...
"extra": {
    "scripts-dev": {
    "post-install-cmd": [
        "npm install --dev"
    ],
    "post-update-cmd": "php ./someCoolCommand.php"
    },
}
...
2
Krasnoperov Viltaly

Exécutez la commande suivante.

 composer update --no-scripts
0
Majbah Habib