Symfony2 Assetic不会在--env = dev上生成复合文件

时间:2013-04-02 18:00:54

标签: symfony assetic

有没有办法告诉Assetic命令行文件在为dev环境构建时不生成复合“output”文件?

我们使用--watch配置运行它。我们有复合文件需要很长时间才能生成并且没有使用,所以这是一个严重的浪费时间。它还会使它重新生成该堆栈中的所有文件,而不是一个更改的文件。

有什么想法吗?如果没有,我很想我自己覆盖资产:dump命令,因为每次我们做一个微小的文件更改时我们都会浪费1-3分钟。 =(


Symfony版本:2.2.0(根据调试栏,只运行Composer更新而没有任何更改)

config.yml(资产块)

assetic:
  debug:          %kernel.debug%
  use_controller: false
  #bundles: []
  #java: /usr/bin/java
  filters:
    cssrewrite: ~
    less:
      node: /usr/bin/node
      node_paths: [/usr/local/lib/node_modules,/usr/lib/node_modules]
      apply_to: "\.less"
    typescript:
      resource: %kernel.root_dir%/../src/GamePlan/Bundle/CoreBundle/Resources/config/assetic.typescript.xml
      apply_to: "\.ts"
      tsc: /usr/local/bin/tsc
      node: /usr/bin/node
      useOut: false

(自定义TypeScriptFilter,但它也发生在CSS文件中,所以它不应该是导致它的......它也是对官方回购中的那个进行相对较小的调整。)

config_dev.yml(资产块)

assetic:
  use_controller: false

使用示例:

{% stylesheets output="bundles/mybundle/styles/mystyle.css"
    filter="cssrewrite"
    "@MyBundle/Resources/styles/a.less"
    "@MyBundle/Resources/styles/b.less"
    "@MyBundle/Resources/styles/subfolder/*.less"
    "@MyBundle/Resources/styles/subfolder/*/*.less"
%}
<link type="text/css" rel="stylesheet" href="{{ asset_url }}"/>
{% endstylesheets %}

运行命令(来自/ var / www作为www-data):

php Symfony/app/console assetic:dump --env=dev [--watch]

有或没有--watch不会更改生成的文件,只要它们全部或只是手表。

请注意,这是否会让任何人知道发生了什么,但它会在生成单个开发文件之前尝试生成复合文件。

我还确保我不会复制任何包含,引用其他块中的任何复合文件等。

它没有在HTML中加载复合文件,但我可以看到它们是从命令生成的。

如果需要更多信息,请告知我们。感谢。

2 个答案:

答案 0 :(得分:1)

所以我最终通过DumpCommand获取了Assetic包。事实证明,无论环境如何,它们都是无条件生成的(如果我们处于调试模式,只有条件只能执行dev)。

为了自己解决这个问题,我只是复制了DumpCommand并制作了我自己的版本,最后我在上面添加了一个条件,所以只有环境是prod才会这样做。我也这样做了它只会在文件发生变化时转储dev文件。

这个解决方案并不完美,需要注意(例如,如果一个文件依赖于另一个文件,它就不会被重新编译,所以如果我有一个文件,我必须不时地运行原始文件编译器错误)。但是,它对我有用。

修改后的dumpAsset()如下所示:

private function dumpAsset($name, OutputInterface $output)
{
    $asset = $this->am->get($name);
    $formula = $this->am->getFormula($name);

    if (!$this->am->isDebug()) {
        // start by dumping the main asset
        $this->doDump($asset, $output);
    }

    // dump each leaf if debug
    if (isset($formula[2]['debug']) ? $formula[2]['debug'] : $this->am->isDebug()) {
        foreach ($asset as $leaf) {
            $mtime = filemtime(($leaf->getSourceRoot() ? $leaf->getSourceRoot() . DIRECTORY_SEPARATOR : '') . $leaf->getSourcePath());
            if ($mtime >= $asset->getLastModified()) {
                $this->doDump($leaf, $output);
            }
        }
    }
}

答案 1 :(得分:0)

private function dumpAsset($name, OutputInterface $output)
{
    $asset = $this->am->get($name);
    $var = false;
    $mtime3 = filemtime(str_replace('_controller/', '', rtrim($this->basePath, '/').'/'.$asset->getTargetPath()));
    foreach ($asset as $leaf) {
        $mtime = $leaf->getLastModified();
        $mtime2 = filemtime(str_replace('_controller/', '', rtrim($this->basePath, '/').'/'.$leaf->getTargetPath()));
        if ($mtime2 > $mtime3)
            $var = true;
        if ($mtime > $mtime2)
        {
            $var = true;
            $this->doDump($leaf, $output);
        }
    }
    if (!$this->am->isDebug() && $var) {
        $this->doDump($asset, $output);
    }
}

Merci et ce fut parfait。

By 42的新秀;)