39

想知道是否可以composer使用一点 PHP 包装器从浏览器执行,因为我无权访问服务器的 shell 访问权限。

不确定您是否可以使用 cURL 执行此操作?

4

6 回答 6

44

Danack 解决方案的另一种选择是将"composer/composer"作为依赖项包含在您composer.jsoncomposer.phar.

作曲家.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.";

当您从浏览器访问脚本时,该命令应按预期运行。

于 2014-08-08T17:22:21.633 回答
31

是的,您可以使用一点 PHP 包装器来运行 Composer。所有 Composer 源代码都在 Phar 文件中可用,因此可以将其提取出来,然后您可以在设置 InputInterface 后运行它来替换 Composer 期望通过命令行传入的命令。

如果您像这样设置目录结构:

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

将下面的代码放入 composerExtractor.php,然后从网络浏览器运行它,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 的访问,并可能在该脚本在服务器上运行后将其删除,以防止它再次意外运行。

于 2013-06-21T21:51:30.703 回答
7

我认为在部署之前在托管源代码的机器上实际运行 Composer 会是一个更好的主意。

在将代码上传到主机之前,您可能会从某种版本控制中签出代码(或者甚至只是将其放在硬盘上)。该机器应该composer install在上传之前安装并执行 Composer。您无需公开生产机器即可下载所有内容。

于 2013-11-12T08:23:30.800 回答
3

我已经成功使用了这个功能。请记住,'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/

于 2016-02-26T16:36:56.293 回答
0

我不知道这是否总是在安装时完成,但我通过 Ubuntu 的软件包安装了 composer,它在“/use/share/php”目录(位于包含路径中)中包含“Composer”。

因此,只需在机器上安装作曲家,我就可以做到:

require_once 'Composer/autoload.php';
$application = new Composer\Console\Application();
于 2017-04-10T17:08:42.730 回答
0

类似于 Endel 的答案,但我需要从composer show --direct数组中捕获输出,所以我从作曲家存储库中的ShowCommand文件中提取了一些代码,并制作了一个作曲家包装库,我可以使用它:

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

并得到一个关联数组,如['composer/composer'=>'1.3.0.0']

于 2017-01-04T13:16:50.457 回答