it-swarm.com.de

Führen Sie den Composer mit einem PHP Skript im Browser

Ich frage mich, ob es möglich ist, composer vom Browser mit einem kleinen PHP - Wrapper auszuführen, da ich keinen Zugriff auf Shell-Zugriff auf den Server habe.

Sie sind sich nicht sicher, ob Sie dies mit cURL tun können?

24
dcolumbus

Ja, Sie können Composer mit einem kleinen Wrapper PHP ausführen. Der gesamte Composer-Quellcode ist in der Phar-Datei verfügbar, sodass er extrahiert werden kann. Anschließend können Sie ihn ausführen, nachdem Sie ein InputInterface eingerichtet haben, um Composer zu ersetzen, der die Befehle erwartet, die über die Befehlszeile übergeben werden.

Wenn Sie Ihre Verzeichnisstruktur folgendermaßen einrichten:

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

Fügen Sie den folgenden Code in composerExtractor.php ein und führen Sie ihn anschließend über einen Webbrowser aus. Composer sollte alle Bibliotheken herunterladen:

./project/vendors/

Außerdem werden die Klassenlader-Dateien in diesem Verzeichnis generiert.

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);

?>

Obwohl dies möglich ist, ist dies keine fantastische Idee, kann aber notwendig sein, wenn Sie keinen Host verwenden können, der Ihnen SSH-Zugriff gewährt.

Ich würde dringend empfehlen, sich zumindest eine statische IP-Adresse für sich selbst oder Ihr Büro zu besorgen und dann den Zugriff auf nur Ihre eigene IP zu beschränken sowie dieses Skript nach dem Ausführen auf dem Server zu löschen, um zu verhindern, dass es versehentlich erneut ausgeführt wird.

25
Danack

Eine Alternative zur Lösung von Danack besteht darin, "composer/composer" als Abhängigkeit in Ihren composer.json aufzunehmen, und verwenden Sie einfach dessen API, anstatt Den Inhalt von composer.phar zu extrahieren.

composer.json

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

Führen Sie composer install manuell aus, damit Sie es für das folgende Skript anfordern können:

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.";

Wenn Sie mit Ihrem Browser auf das Skript zugreifen, sollte der Befehl wie erwartet ausgeführt werden.

36
Endel

Ich denke, es wäre eine bessere Idee, Composer auf dem Computer auszuführen, auf dem der Quellcode kurz vor der Bereitstellung gehostet wird.

Wahrscheinlich checken Sie Ihren Code von einer Art Versionskontrolle aus, bevor Sie ihn auf Ihren Host hochladen (oder sogar ohne Festplatte auf Ihrer Festplatte). Dieser Rechner sollte Composer installiert bekommen und composer install direkt vor dem Upload ausführen. Sie müssen die Produktionsmaschine nicht zum Download bereitstellen.

6
Sven

Ich habe diese Funktion erfolgreich verwendet. Beachten Sie, dass Composer-Source ein Verzeichnis ist, dessen Inhalt aus dem Archiv von Composer.phar extrahiert wurde.

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);
}

Übrigens können Sie composer.phar auf dieser Site extrahieren: http://unphar.com/

2

Ich weiß nicht, ob dies immer bei der Installation geschieht, aber ich habe Composer über Ubuntus Paket installiert und "Composer" im Verzeichnis "/ use/share/php" (das sich im Include-Pfad befindet) hinzugefügt.

Daher kann ich, indem ich Composer einfach auf der Maschine installiert habe, Folgendes tun:

require_once 'Composer/autoload.php';
$application = new Composer\Console\Application();
0
Nathan Crause

Ähnlich wie Endels Antwort, aber ich musste die Ausgabe von composer show --direct in einem Array erfassen, also extrahierte ich etwas Code aus der Datei ShowCommand im Composer-Repository und erstellte eine composer-wrapper -Bibliothek, mit der ich tun können:

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

und erhalten Sie ein assoziatives Array wie ['composer/composer'=>'1.3.0.0']

0
shadi