【问题标题】:How do I combine & minify JS and CSS for a Yii app on Heroku?如何在 Heroku 上为 Yii 应用组合和缩小 JS 和 CSS?
【发布时间】:2015-06-06 20:06:47
【问题描述】:

我尝试按照指南中的说明进行操作,但出现错误。

http://www.yiiframework.com/doc-2.0/guide-structure-assets.html#combining-and-compressing-assets

$ yii asset assets.php config/assets-prod.php
Loading configuration from 'assets.php'...
Collecting source bundles information...
Creating output bundle 'all':
  Compressing JavaScript files...
PHP Warning 'yii\base\ErrorException' with message 'file_put_contents(/cygdrive/c/Users/Chloe/workspace/xxxxxx/web/assets/js/all-temp.js.tmp): failed to open stream: No such file or directory'

in /cygdrive/c/Users/Chloe/workspace/xxxxxx/vendor/yiisoft/yii2/console/controllers/AssetController.php:545

Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleError(2, 'file_put_conten...', '/cygdrive/c/Use...', 545, Array)
#1 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/console/controllers/AssetController.php(545): file_put_contents('/cygdrive/c/Use...', '/*** BEGIN FILE...')
#2 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/console/controllers/AssetController.php(487): yii\console\controllers\AssetController->combineJsFiles(Array, '/cygdrive/c/Use...')
#3 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/console/controllers/AssetController.php(343): yii\console\controllers\AssetController->compressJsFiles(Array, '/cygdrive/c/Use...')
#4 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/console/controllers/AssetController.php(182): yii\console\controllers\AssetController->buildTarget(Object(yii\web\AssetBundle), 'js', Array)
#5 [internal function]: yii\console\controllers\AssetController->actionCompress('assets.php', 'config/assets-p...')
#6 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/base/InlineAction.php(55): call_user_func_array(Array, Array)
#7 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/base/Controller.php(151): yii\base\InlineAction->runWithParams(Array)
#8 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/console/Controller.php(91): yii\base\Controller->runAction('', Array)
#9 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/base/Module.php(455): yii\console\Controller->runAction('', Array)
#10 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/console/Application.php(161): yii\base\Module->runAction('asset', Array)
#11 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/console/Application.php(137): yii\console\Application->runAction('asset', Array)
#12 /cygdrive/c/Users/Chloe/workspace/xxxxx/vendor/yiisoft/yii2/base/Application.php(375): yii\console\Application->handleRequest(Object(yii\console\Request))
#13 /cygdrive/c/Users/Chloe/workspace/xxxxx/yii(23): yii\base\Application->run()
#14 {main}

这是我得到的最接近的:

Loading configuration from 'assets.php'...
Collecting source bundles information...
Creating output bundle 'all':
  Compressing JavaScript files...
ERROR - Cannot read: \cygdrive\c\Users\Chloe\workspace\xxxxx\web\assets\all-temp.js.tmp

1 error(s), 0 warning(s)
Error: Unable to compress JavaScript files into '/cygdrive/c/Users/Chloe/workspace/xxxxx/web/assets/all-temp.js'.

这是我的assets.php 文件

assets.php
Yii::setAlias('@webroot', __DIR__ . '/web');
Yii::setAlias('@web', '/');

return [
    // Adjust command/callback for JavaScript files compressing:
    'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}',
    // Adjust command/callback for CSS files compressing:
    'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}',
    // The list of asset bundles to compress:
    'bundles' => [
        'app\assets\AppAsset',
        'yii\web\YiiAsset',
        'yii\web\JqueryAsset',
    ],
    // Asset bundle for compression output:
    'targets' => [
        'all' => [
            'class' => 'yii\web\AssetBundle',
            'basePath' => '@webroot/assets',
            'baseUrl' => '@web/assets',
            'js' => 'js/all-{hash}.js',    # also without js/
            'css' => 'css/all-{hash}.css', # also without css/
        ],
    ],
    // Asset manager configuration:
    'assetManager' => [
        'basePath' => '@webroot/assets',
        'baseUrl' => '@web/assets',
    ],
];

【问题讨论】:

    标签: php heroku yii yii2


    【解决方案1】:

    好吧,这主要是因为我使用的是 Cygwin。 Java 命令是 Windows Java 命令,所以不熟悉 /cygdrive/c/。 Yii 会删除生成的临时文件,因此无法知道它是否正常工作。我测试了 Yii 是否用这个生成了任何东西:

    'jsCompressor' => 'echo java -jar compiler.jar --js {from} --js_output_file {to}; cp /cygdrive/c/Users/Chloe/workspace/xxx/web/assets/all-temp.js.tmp /tmp/',
    

    然后我至少可以查看合并后的文件。我通过在这样的管理员控制台中添加一个 Windows 符号链接(连接可能也可以)来修复它

    mkdir \cygdrive
    cd \cygdrive
    C:\cygdrive>mklink /d c C:\
    

    然后/cygdrive/c/Users 将存在于 Windows 应用程序中。 (安装像 OpenJDK 这样的基于 Cygwin 的 JRE 并将其放在路径的第一位也可能会起作用。)我还将 target 更改为此以摆脱子目录

            'js' => 'all-{hash}.js',    
            'css' => 'all-{hash}.css', 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-12
      • 2012-03-18
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多