1

開発環境用にビルドするときに、Assetic コマンドライン ファイルに複合「出力」ファイルを生成しないように指示する方法はありますか?

--watch 構成で実行しています。生成に時間がかかり、使用されていない複合ファイルがあるため、これは深刻な時間の無駄です。また、変更された 1 つのファイルではなく、そのスタック内のすべてのファイルを再生成します。

何か案は?そうでない場合は、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 ファイルでも同様に発生しているため、それが原因である必要はありません...公式リポジトリのものに対する比較的マイナーな調整でもあります。)

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 を実行することになりました。環境に関係なく、それらは常に無条件に生成されることがわかります(デバッグモードの場合、devのもののみを実行する条件のみがあります)。

自分で修正するために、その DumpCommand をコピーして独自のバージョンを作成し、上記に条件を追加して、環境が本番環境の場合にのみ実行するようにしました。また、そのファイルが変更された場合にのみ 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);
            }
        }
    }
}
于 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 パフェ。

によって 42 の新人 ;)

于 2014-02-05T10:15:47.217 に答える