php console.php say:hello MyName
时,下面的独立命令应用可以自行运行
问题出在底部。
/var/www/html/local/test-app/composer.json
{
"name": "my/test-package",
"description": "......",
"type": "library",
"version": "1.0.0",
"autoload": {
"psr-0": {"": ""}
},
"require": {
"symfony/console": "2.*"
},
"minimum-stability": "stable"
}
/var/www/html/local/test-app/Command/HelloCommand.php
<?php
namespace Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class HelloCommand extends Command
{
protected function configure()
{
$this
->setName('say:hello')
->setDescription('Say hello to someone')
->addArgument(
'name',
InputArgument::OPTIONAL,
'Who do you want to say hello?'
);
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
$hello = $name ? 'Hello '.$name : 'Hello';
$output->writeln($hello);
}
}
/var/www/html/local/test-app/console.php
#!/usr/bin/env php
<?php
require __DIR__.'/vendor/autoload.php';
use Command\HelloCommand;
use Symfony\Component\Console\Application;
$application = new Application();
$application->add(new HelloCommand());
$application->run();
问题
当我在我的主项目的composer.json中包含独立包时,composer会安装所有内容,但是当我调用php console.php say:hello MyName
时出现Could not open input file: console.php
错误。显然我必须在bin
目录中创建一个符号链接,如behat,phing,phpspec,doctrine等,但是如何?
我的主要项目作曲家json
"require": {
"my/test-package": "dev-master"
},
我查了一下:
所以.......
答案 0 :(得分:1)
Composer将在 vendor 目录中安装依赖项。您可以使用 console.php 文件的完整路径:
php vendor/my/test-package/console.php say:hello MyName
看到完整路径而不是 vendor / bin / 可能看起来很奇怪,但这是一种有效的方法,如Wouter J with for PHPUnit所示。它有一个优点:它将调用正确的命令而不是另一个时间(例如,另一个包已经创建了 vendor / bin / console.php 文件)。
答案 1 :(得分:1)
如果要使用composer use
来定位二进制文件的特定目录{
....
"config": {
"bin-dir": "bin"
},
....
}
这样,您可以在项目的根目录中找到bin
目录中的所有二进制文件(因为它会自动为您创建动态链接)。
不要忘记将此目录(bin
)添加到.gitignore文件中。
答案 2 :(得分:1)
解决。我完整地举例说明其他任何人都可以从中受益。
STANDALONE SYMFONY2 CONSOLE COMMAND APP
<强> /var/www/html/local/test-app/composer.json 强>
在下面创建composer.json文件后运行composer install
。
{
"name": "my/test-package",
"description": "Write something here",
"type": "library",
"version": "1.0.0",
"autoload": {
"psr-0": {
"Command": "src/"
}
},
"require": {
"symfony/console": "2.*"
},
"minimum-stability": "stable",
"bin": [
"bin/console"
]
}
<强> /无功/网络/ HTML /本地/测试应用程式内/ bin中/控制台强>
确保使其可执行,因此请先运行chmod +x bin/console
。
#!/usr/bin/env php
<?php
set_time_limit(0);
(@include_once __DIR__ . '/../vendor/autoload.php') || @include_once __DIR__ . '/../../../autoload.php';
use Command\HelloCommand;
use Symfony\Component\Console\Application;
$app = new Application('My CLI Application', '1.0.0');
$app->add(new HelloCommand());
$app->run();
<强> /var/www/html/local/test-app/src/Command/HelloCommand.php 强>
<?php
namespace Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class HelloCommand extends Command
{
protected function configure()
{
$this
->setName('say:hello')
->setDescription('Say hello to someone')
->addArgument(
'name',
InputArgument::OPTIONAL,
'Who do you want to say hello?'
);
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
$hello = $name ? 'Hello '.$name : 'Hello';
$output->writeln($hello);
}
}
<强>测试强>
test-app$ bin/console say:hello MyName
Hello MyName
独立控制台命令应用程序现已准备就绪,但您也想在主项目中使用它,为此,请执行以下操作。
您的主要项目
在composer.json文件中包含新包后,运行composer update my/test-package
。
<强> /var/www/html/local/my-main-app/composer.json 强>
{
"name": "my/main-app",
"type": "project",
"description": "Main",
"autoload": {
"psr-0": { "": "src/" }
},
"repositories": [
{
"type": "git",
"url": "git@github.com:my/test-package.git"
}
],
"require": {
.......
.......
"my/test-package": "dev-master"
},
"minimum-stability": "stable"
}
如果查看bin
目录,您应该看到名为console
的文件,这意味着您可以在主应用程序中使用该命令。
<强>测试强>
my-main-app$ bin/console say:hello MyName
Hello MyName