Magento 2-setup:di:compile throws没有提供令牌错误


11

在我运行的magento 2中,setup:di:compile出现以下错误:

[Zend \ Code \ Exception \ RuntimeException]
没有提供令牌

如何解决这个问题呢?

我禁用了所有其他模块,运行setup:upgrade,但仍然出现令牌错误。

Answers:


23

我遇到了这个问题,并在可以使用的“没有提供令牌”的每个实例上设置断点:

grep -lr 'No tokens were provided' vendor/

返回:

vendor/zendframework/zend-code/src/Scanner/ConstantScanner.php
vendor/zendframework/zend-code/src/Scanner/TokenArrayScanner.php
vendor/zendframework/zend-code/src/Scanner/MethodScanner.php
vendor/zendframework/zend-code/src/Scanner/PropertyScanner.php
vendor/zendframework/zend-code/src/Scanner/ClassScanner.php

我的例外是在TokenArrayScanner.php文件中引发。“令牌”实例值是在构造函数中设置的,因此我在此处放置了一个断点并重新启动了该过程。不幸的是,该构造函数在多个文件上被多次调用,并且正在被标记化的文件的数据不包含在构造调用中。我能够确定“令牌”只是被检查文件的几行。根据CarComp的帖子,我用它来查找有问题的文件:

find . -type f -name '*.php' -empty

这打开了许多文件,这些文件位于包含“ dev / tests”(不包括在扫描中)的路径下,以及来自第三方开发人员的单个文件中。删除此文件解决了该问题,并且仅在抱怨而不是例外的情况下完成了compile命令。


谢谢,真的非常有帮助。删除文件后,我的自定义模块中有一个空白文件,我可以编译且没有错误。
Manish

10

在这里,如果您想知道如何找到那些空文件,只需在magento根目录或您正在工作的任何目录中都有空文件的情况下运行此命令(假设您具有linux,并访问shell)。 。

find -type f -empty

5

似乎您有一个空文件,该文件由\ Magento \ Setup \ Module \ Di \ Code \ Reader \ ClassesScanner解析,该文件使用PHP token_get_all方法。如果该方法未返回任何值,则抛出异常,在空文件中就是这种情况。


3

空文件还会引发“未提供令牌”问题,因此应该检查ClassesScanner,以评估使用的目录条目或任何类文件是否为有效文件,以及其内容是否为空。您需要在创建的文件中添加适当的内容,否则就不应定义/创建。


3

您可以将其放入以下条件中:

    if (!$this->tokens) {
        \Zend_Debug::dump(get_object_vars($this); exit;
        throw new \Zend\Code\Exception\RuntimeException('No tokens were provided');
    }

然后检查system.log以查看哪个文件产生了此错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.