【问题标题】:Including Symfony2 standalone console components packages in main app to access commands在主应用程序中包含 Symfony2 独立控制台组件包以访问命令
【发布时间】:2015-12-12 01:50:15
【问题描述】:

当我打电话时,下面的独立命令应用程序可以正常工作: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、doct 等,但是如何?

我主要项目的composer json

"require": {
    "my/test-package": "dev-master"
},

我已经检查过:

等等……

【问题讨论】:

  • 我认为这里没有魔法,你不在正确的目录中,或者console.php 的权限不正确。
  • 这与 Symfony 相关的任何东西都无关——每当您使用不存在的文件调用 php 时都会出现该错误:$ php DoesNotExist.php 输出 Could not open input file: DoesNotExist.php。否则,请检查以确保 console.php 具有 读取 权限。

标签: php symfony composer-php


【解决方案1】:

解决了。我给出了完整的例子,以便其他人可以从中受益。

独立的 SYMFONY2 控制台命令应用程序

/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"
  ]
}

/var/www/html/local/test-app/bin/console

确保使其可执行,因此首先运行: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

【讨论】:

    【解决方案2】:

    如果您想使用 Composer 为二进制文件定位特定目录

    {
        ....
        "config": {
            "bin-dir": "bin"
        },
        ....
    }
    

    这让您在项目的根目录中拥有一个 bin 目录,用于存放其中的所有二进制文件(因为它会自动为您创建动态链接)。

    不要忘记将此目录 (bin) 添加到您的 .gitignore 文件中。

    更多信息:https://getcomposer.org/doc/articles/vendor-binaries.md#can-vendor-binaries-be-installed-somewhere-other-than-vendor-bin-

    【讨论】:

      【解决方案3】:

      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 文件)。

      【讨论】:

      • 这听起来是对的,但我持怀疑态度,因为问题表明console.php 位于/var/www/html/local/test-app/console.php。是否有理由将其安装在vendor/ 之外?
      • @HPierce 你说的是主项目,用户正试图在另一个项目中将它与作曲家一起使用。 (这就是我理解问题的方式)
      猜你喜欢
      • 2014-11-08
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2015-09-26
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      相关资源
      最近更新 更多