Exécutez composer avec un script PHP dans le navigateur

Je me demande s'il est possible d'exécuter composer à partir du navigateur avec un petit wrapper PHP car je n'ai pas accès à l'accès shell au serveur.

Vous ne savez pas si vous pouvez le faire avec cURL?

24
demandé sur Martijn Pieters 2013-06-20 20:55:45

6 réponses

Oui, vous pouvez exécuter Composer avec un petit wrapper PHP. Tout le code source Composer est disponible dans le fichier Phar, il peut donc être extrait et vous pouvez l'exécuter après avoir configuré une InputInterface pour remplacer Composer en attendant que les commandes soient transmises via la ligne de commande.

Si vous configurez votre structure de répertoire comme ceci:

./project  
./project/composer.json
./project/composer.lock
./project/webroot/composerExtractor.php  
./project/var/

Mettez le code ci-dessous dans composerExtractor.php puis exécutez-le à partir d'un navigateur web, Composer devrait télécharger toutes les bibliothèques dans:

./project/vendors/

Ainsi que la génération des fichiers class-loader dans ce répertoire ainsi.

ComposerExtractor.php

<?php

define('EXTRACT_DIRECTORY', "../var/extractedComposer");


if (file_exists(EXTRACT_DIRECTORY.'/vendor/autoload.php') == true) {
    echo "Extracted autoload already exists. Skipping phar extraction as presumably it's already extracted.";
}
else{
    $composerPhar = new Phar("Composer.phar");
    //php.ini setting phar.readonly must be set to 0
    $composerPhar->extractTo(EXTRACT_DIRECTORY);
}

//This requires the phar to have been extracted successfully.
require_once (EXTRACT_DIRECTORY.'/vendor/autoload.php');

//Use the Composer classes
use Composer\Console\Application;
use Composer\Command\UpdateCommand;
use Symfony\Component\Console\Input\ArrayInput;

// change out of the webroot so that the vendors file is not created in
// a place that will be visible to the intahwebz
chdir('../');

//Create the commands
$input = new ArrayInput(array('command' => 'update'));

//Create the application and run it with the commands
$application = new Application();
$application->run($input);

?>

Bien que cela soit possible, ce n'est pas une idée fantastique mais peut être nécessaire si vous ne pouvez pas utiliser un hôte qui vous donne un accès ssh.

Je recommande fortement au moins d'obtenir une adresse IP statique pour vous - même ou votre bureau, puis de restreindre l'accès à votre propre adresse IP, ainsi que de supprimer probablement ce script après son exécution sur le serveur pour éviter qu'il ne soit accidentellement exécuté à nouveau.

24
répondu Danack 2013-06-21 22:17:47

Une alternative à la solution de Danack consiste à inclure "composer/composer" comme dépendance dans votre composer.json, et utilisez simplement son API, au lieu d'extraire le contenu de composer.phar.

Le Compositeur.json

...
"require-dev": {
  "composer/composer": "dev-master",
}
...

Exécuter composer install manuellement, de sorte que vous serez en mesure de l'exiger sur le script suivant:

Composer_install.php

<?php
require 'vendor/autoload.php'; // require composer dependencies

use Composer\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;

// Composer\Factory::getHomeDir() method 
// needs COMPOSER_HOME environment variable set
putenv('COMPOSER_HOME=' . __DIR__ . '/vendor/bin/composer');

// call `composer install` command programmatically
$input = new ArrayInput(array('command' => 'install'));
$application = new Application();
$application->setAutoExit(false); // prevent `$application->run` method from exitting the script
$application->run($input);

echo "Done.";

Lorsque vous accédez au script depuis votre navigateur, la commande doit s'exécuter comme prévu.

32
répondu Endel 2017-06-01 22:12:42

Je pense que ce serait une meilleure idée d'exécuter Composer sur la machine qui héberge votre code source juste avant le déploiement.

Vous avez probablement Extrait votre code d'une sorte de contrôle de version avant de le télécharger sur votre hôte (ou même simplement l'avoir sur votre disque dur sans). Cette machine doit installer Composer et exécuter composer install juste avant le téléchargement. Vous n'avez pas besoin d'exposer la machine de production pour télécharger toutes les choses.

6
répondu Sven 2013-11-12 08:23:30

J'ai utilisé avec succès cette fonction. Gardez à l'esprit que 'composer-source' est un répertoire avec du contenu extrait de composer.archive phar.

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\StreamOutput;

function composerInstall() {
    //create composer.json with some content
    require_once 'composer-source/vendor/autoload.php';
    putenv('COMPOSER_HOME=' . __DIR__ . '/composer-source/bin/composer');
    chdir(__DIR__);
    $stream = fopen('php://temp', 'w+');
    $output = new StreamOutput($stream);
    $application = new Application();
    $application->setAutoExit(false);
    $code = $application->run(new ArrayInput(array('command' => 'install')), $output);
    return stream_get_contents($stream);
}

En passant, vous pouvez extraire composer.phar sur ce site: http://unphar.com/

2
répondu Mangirdas Skripka 2016-02-28 15:14:22

Similaire à la réponse D'Endel, mais j'avais besoin de capturer la sortie de composer show --direct dans un tableau, donc j'ai extrait du code du fichier ShowCommand dans le référentiel composer et fait une bibliothèquecomposer-wrapper , avec laquelle je peux faire:

$cw = new \shadiakiki1986\ComposerWrapper();
$packages = $cw->showDirect();

Et obtenir un tableau associatif comme ['composer/composer'=>'1.3.0.0']

0
répondu shadi 2017-01-04 13:16:50

Je ne sais pas si cela se fait toujours lors de l'installation, mais j'ai installé composer via le paquet Ubuntu, et il a inclus "Composer" dans le répertoire"/use/share / php " (qui est dans le chemin d'inclusion).

Par conséquent, en ayant simplement installé composer sur la machine, je suis capable de faire:

require_once 'Composer/autoload.php';
$application = new Composer\Console\Application();
0
répondu Nathan Crause 2017-04-10 17:08:42