サーバーへのシェルアクセスにアクセスできないので、ブラウザーからcomposer
を少しのPHPラッパーで実行できるかどうか疑問に思います。
CURLでこれができるかどうかわかりませんか?
はい、実行できますComposer少しPHPラッパー。すべてのComposerソースコードはPharファイルで利用可能です。 、抽出できるため、InputInterfaceを設定してから実行して、Composerコマンドラインを介してコマンドが渡されることを期待します。
次のようにディレクトリ構造を設定する場合:
./project
./project/composer.json
./project/composer.lock
./project/webroot/composerExtractor.php
./project/var/
以下のコードをcomposerExtractor.phpに入れて、Webブラウザーから実行すると、Composerはすべてのライブラリを以下にダウンロードするはずです。
./project/vendors/
そのディレクトリにクラスローダーファイルも生成します。
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);
?>
これは可能ですが、素晴らしいアイデアではありませんが、sshアクセスを提供するホストを使用できない場合に必要になることがあります。
少なくとも自分やオフィスの静的IPアドレスを取得し、アクセスを自分のIPだけに制限することを強くお勧めします。また、誤って再実行されるのを防ぐため、サーバーで実行した後にこのスクリプトを削除することを強くお勧めします。
Danackのソリューションに代わる方法は、"composer/composer"
に依存関係としてcomposer.json
を含め、composer.phar
からコンテンツを抽出する代わりにAPIを使用することです。
composer.json
...
"require-dev": {
"composer/composer": "dev-master",
}
...
composer install
を手動で実行すると、次のスクリプトで要求できるようになります。
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.";
ブラウザからスクリプトにアクセスすると、コマンドは期待どおりに実行されます。
展開の直前にソースコードをホストするマシンでComposerを実際に実行することをお勧めします。
ホストにアップロードする前に、何らかのバージョン管理からコードをチェックアウトするでしょう(または、ハードドライブにコードを追加するだけでも構いません)。そのマシンは、Composerをインストールして実行し、composer install
アップロードの直前。すべてのものをダウンロードするために生産マシンを公開する必要はありません。
この関数を正常に使用しました。 「composer-source」はcomposer.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);
}
ところで、このサイトでcomposer.pharを抽出できます。 http://unphar.com/
これがインストール時に常に行われるかどうかはわかりませんが、composerをUbuntuのパッケージ経由でインストールし、 "/ use/share/php"ディレクトリ( "インクルードパス内)。
したがって、単にマシンにcomposer=をインストールするだけで、次のことが可能になります。
require_once 'Composer/autoload.php';
$application = new Composer\Console\Application();
Endelの答えに似ていますが、配列のcomposer show --direct
からの出力をキャプチャする必要があったため、 ShowCommand ファイルからいくつかのコードを抽出しましたcomposerリポジトリを作成し、 composer-wrapper ライブラリを作成しました。
$cw = new \shadiakiki1986\ComposerWrapper();
$packages = $cw->showDirect();
['composer/composer'=>'1.3.0.0']
のような連想配列を取得します