'lessc' 不是内部或外部命令,Yii2 WAMP win8

'lessc' is not recognized as an internal or external command, Yii2 WAMP win8

所以我通常在外部服务器上工作,但决定在我的 windows 8.1 计算机上以 WAMPserver 的形式设置本地环境。

从 (git bash) 控制台,我可以 运行 lessc 没有问题,但是当我安装 Yii2 并尝试处理 .less 时,它说它不能找到命令。

AssetConverter command 'lessc "C:/wamp/www/basic/web/css/site.less" "C:/wamp/www/basic/web/css/site.css" --no-color --source-map' failed with exit code 1:
STDOUT:

STDERR:
'lessc' is not recognized as an internal or external command,
operable program or batch file.

据我所知,这应该可行。事实上,当我 运行 来自控制台的相同命令时,它工作得很好。我在这里错过了一步吗?任何帮助将不胜感激。

最终通过更改命令以直接引用 lessc.cmd 来修复它

'assetManager'=>[
            'converter' => [
                'class' => 'yii\web\AssetConverter',
                'commands' => [
                    'less' => ['css', 'c:\path\to\lessc.cmd {from} {to} --no-color'],
                ],
            ],
        ],

对这个修复不太满意,因为这意味着我在去 'live' 时需要更改我的设置,但没有其他任何效果。我尝试将它符号链接到 yii 目录、命令目录等。但是没有用。

我刚刚修好了。

你应该怎么做?

  • 确保你可以 运行 cmd 中的 lessc windows.If 你不能,用 node.js 安装它 Install lessc with node.js
  • 确保系统path.Mine中的lessc路径是C:\Users\l7861\AppData\Roaming\npm或者你可以在cmd中键入where lesscwindows来找到它。
  • 确保你可以在 path_info() 中看到 lessc 路径。如果你不能重新启动你的 apache 服务器。
  • 终于不用在config中添加addassetManager了~~~~~

下面是一个发现过程。

我只是认为这是 first.So 上 yii2 的一个错误 我用 Phpstrom.And 调试它 我看到了这一行:path\to\vendor\yiisoft\yii2\web\AssetConverter.php 91

$command = Yii::getAlias($command);
    
    $command = strtr($command, [
        '{from}' => escapeshellarg("$basePath/$asset"),
        '{to}' => escapeshellarg("$basePath/$result"),
    ]);
    $descriptor = [
        1 => ['pipe', 'w'],
        2 => ['pipe', 'w'],
    ];
    $pipes = [];
    $proc = proc_open($command, $descriptor, $pipes, $basePath);
    $stdout = stream_get_contents($pipes[1]);
    $stderr = stream_get_contents($pipes[2]);
    foreach ($pipes as $pipe) {
        fclose($pipe);
    }
    $status = proc_close($proc);

    if ($status === 0) {
        Yii::trace("Converted $asset into $result:\nSTDOUT:\n$stdout\nSTDERR:\n$stderr", __METHOD__);
    } elseif (YII_DEBUG) {
        throw new Exception("AssetConverter command '$command' failed with exit code $status:\nSTDOUT:\n$stdout\nSTDERR:\n$stderr");
    } else {
        Yii::error("AssetConverter command '$command' failed with exit code $status:\nSTDOUT:\n$stdout\nSTDERR:\n$stderr", __METHOD__);
    }
    return $status === 0
}

只有当 $status 不为 0 时,才会收到错误消息。

这通常意味着 $command 有问题。

当我运行这里时,我可以看到它是'lessc "path/to/frontend/web/less/main.less" "path/to/frontend/web/less/main.css" --no-color';

而我运行它在cmd.Thencss文件是由它创建的

我在下面写了一个类似的代码,就像那个函数

$command='lessc "path/to/frontend/web/less/main.less" "path/to/frontend/web/less/main.css" --no-color';
$basePath="path/to/frontend/web";
$descriptor = [
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w'],
];
$pipes = [];

$process = proc_open($command, $descriptor, $pipes /* $cwd, $env */ );
print_r($pipes);

$stdout = stream_get_contents($pipes[1]);
echo mb_convert_encoding($stdout, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5' );
$stderr = stream_get_contents($pipes[2]);
echo mb_convert_encoding($stderr, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5' );
if (is_resource($process)) {
    fwrite($pipes[1], '<?php print_r($_ENV); ?>');
    fclose($pipes[1]);

    echo stream_get_contents($pipes[2]);
    fclose($pipes[2]);
    $return_value = proc_close($process);

    echo "command returned $return_value\n";
}

和运行它在browser.Then我得到一个错误“lessc不被识别为内部或外部命令”。

所以我更改了配置文件 config/main.php,

    return [
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'assetManager' => [
            'converter' => [
                'class' => 'yii\web\AssetConverter',
                'commands' => [
                    'less' => ['css', 'lessc {from} {to} --no-color'],
                ],
            ],
        ],
    ],
    'name' => 'FavorTGD',
];

我得到了一个相同的 message.So 我查看了 php_info(),path.there 中没有 lessc 程序 there.That 你只需要重新启动你的 apache。

并删除 main.php

中的 assetManager