1

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

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

有任何想法吗?如果没有,我很想自己重写asset: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 文件中,所以它不应该是导致它的原因......这也是官方 repo 中的一个相对较小的调整。)

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 中加载复合文件,但我可以看到它们是从命令生成的。

如果需要更多信息,请告诉我。谢谢。

4

2 回答 2

1

所以我最终通过了 Assetic 包的 DumpCommand。事实证明,无论环境如何,它们总是无条件地生成(如果我们处于调试模式,只有一个条件可以只做开发者)。

为了自己修复它,我只是复制了那个 DumpCommand 并制作了我自己的版本,我最终在上面添加了一个条件,所以它只有在环境是 prod 时才会这样做。我也做到了,所以如果该文件已更改,它只会转储开发文件。

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

修改后的 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);
            }
        }
    }
}
于 2013-04-03T21:30:38.300 回答
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。

通过 42 新秀 ;)

于 2014-02-05T10:15:47.217 回答