Assetic正在生成多个具有相同内容的文件。

3

我有一个使用Assetic将一些CSS文件生成到磁盘的类。我将直接进入代码。

在我的布局头部,我正在这样做:

$assetify = new Assetify();  
$assetify->setDebug(true);
$assetify->setAssetDirectory(BASE_DIR . '/public/assets');
$assetify->setOutputDirectory(BASE_DIR . '/public/assets/generated');
$assetify
    ->addStylesheet('/assets/css/bootstrap-2.3.2.css')
    ->addStylesheet('/assets/css/select2-3.4.3.css')
    ->addStylesheet('/assets/css/main.css');

echo $assetify->dump();

我的“Assetify”类通过Assetic运行此项任务。我将从dump()函数中复制我希望是相关部分的代码:

// The Asset Factory allows us to not have to do all the hard work ourselves.
$factory = new AssetFactory($this->assetDirectory, $this->debug);
$factory->setDefaultOutput('/generated/*.css');

// The Filter Manager allows us to organize filters for the asset handling.
// For other filters, see: https://github.com/kriswallsmith/assetic
$fm = new FilterManager();
$fm->set('yui_css', new Yui\CssCompressorFilter('/usr/local/bin/yuicompressor-2.4.7.jar'));
$fm->set('yui_js', new Yui\JsCompressorFilter('/usr/local/bin/yuicompressor-2.4.7.jar'));
$factory->setFilterManager($fm);

// The Asset Manager allows us to keep our assets organized.
$am = new AssetManager();
$factory->setAssetManager($am);

// The cache-busting worker prefixes every css with what amounts to a version number.
$factory->addWorker(new CacheBustingWorker());

$assetCollection = array();
foreach ($assetGroups as $assetGroup) {
    foreach ($assetGroup as $media => $items) {
        $fileCollection = array();
        foreach ($items as $item) {
            // Add this asset to the asset collection.
            $fileCollection[] = new FileAsset($item);
        }
        $assetCollection[] = new AssetCollection($fileCollection);
    }
}

$assetCollection = new AssetCollection($assetCollection);
$am->set('base_css', $assetCollection);

// Generate the required assets. Prefixing a filter name with a question mark
// will cause that filter to be omitted in debug mode.
$asset = $factory->createAsset(
    array('@base_css'),
    array('?yui_css')
);

// Configure an internal file system cache so we don't regenerate this file on every load.
$cache = new AssetCache(
    $asset,
    new FilesystemCache($this->outputDirectory)
);

// And generate static versions of the files on disk.
$writer = new AssetWriter($this->assetDirectory);
$writer->writeAsset($cache);

这将生成两个不同的文件,87229eb-f47a352.cssa37c1589762f39aee5bd24e9405dbdf9。这两个文件的内容完全相同。87229eb-f47a352.css 文件似乎每次都会被生成,而除非文件内容发生更改(这就是我想要的),否则不会重新生成另一个文件。如果我注释掉 $writer->writeAsset($cache),那么就不会写入任何文件到磁盘中。

我缺少了什么明显的配置?感谢您的帮助,谢谢。


你搞定了吗?我也想实现类似的功能。你的类看起来非常有用,能分享一下吗? - Asa Carter
非常抱歉,我直到今天才看到这个通知!差不多两年过去了。天啊。非常感谢您的答案,我已经接受了。我实际上从来没有想出来,只能继续前进,所以最终我的脚本只删除了生成后的所有无扩展名文件。 - Vic
1个回答

1
我成功地复制了您的代码并得到了相同的结果。
我试图获得与您所需的相同的结果,但最终编写了自己的代码来缓存和提供静态文件。
它还不完善,但它是可行的。它具有以下功能:
  • 如果指定$filename,则可以选择为不同页面缓存文件
  • 您可以选择创建已发布文件的版本或删除以前的版本
  • 只有在源文件发生更改时才会将缓存文件生成到目标文件夹中
  • 您只需要将代码放入类或函数中并返回要提供的URL即可。
希望能对您有所帮助 :)
 <?php
    use Assetic\Factory\AssetFactory;
    use Assetic\AssetManager;
    use Assetic\FilterManager;
    use Assetic\Asset\AssetCollection;
    use Assetic\Asset\FileAsset;
    use Assetic\Filter\JSMinFilter;

    // JavaScript Collection
    $js_collection[] = new FileAsset(SCRIPT_PATH . 'jquery.js');
    $js_collection[] = new FileAsset(SCRIPT_PATH . 'production.js');
    if (file_exists(SCRIPT_PATH . $page_info['name'] . '.js')) {
        $js_collection[] = new FileAsset(SCRIPT_PATH . $page_info['name'] . '.js');
    }

    // CSS Collection
    $css_collection[] = new FileAsset(STYLE_PATH . 'theme.css');
    if (file_exists(STYLE_PATH . $page_info['name'] . '.css')) {
        $css_collection[] = new FileAsset(STYLE_PATH . $page_info['name'] . '.css');
    }

    // The Filter Manager allows us to organize filters for the asset handling.
    $fm = new FilterManager();
    $fm->set('js', new JSMinFilter());

    $js = new AssetCollection (
        $js_collection
    );
    $js->setTargetPath(SCRIPT_PATH . 'static');

    $css = new AssetCollection (
        $css_collection
    );
    $css->setTargetPath(STYLE_PATH . 'static');

    $am = new AssetManager();
    $am->set('js', $js);
    $am->set('css', $css);



    //** TO DO: put the below in a class and return the static file names **//

    // options
    $seperator = '-';
    $filename = $page_info['name'];
    $versions = false;

    // get a list of all collection names
    $collections = $am->getNames();

    // get each collection
    foreach ($collections as $collection_name) {

        // get the collection object
        $collection = $am->get($collection_name);

        // ensure file types are identical
        $last_ext = false;
        foreach ($collection as $leaf) {
            $ext = strtolower(pathinfo($leaf->getSourcePath(), PATHINFO_EXTENSION));
            if (!$last_ext || $ext == $last_ext) {
                $last_ext = $ext;
            } else {
                throw new \RuntimeException('File type mismatch.');
            }
        }

        // get the highest last-modified value of all assets in the current collection
        $modified_time = $collection->getLastModified();

        // get the target path
        $path = $collection->getTargetPath();

        // the target path must be set
        if (!$path) {
            throw new \RuntimeException('Target path not specified.');
        }

        // build the filename to check
        $file = ($filename) ? $filename . $seperator . $modified_time . '.' . $ext : $modified_time . '.' . $ext;
        $cached_file  = $path . '/' . $file;

        // the file doesn't exist so we need to minify, dump and save as new cached file
        if (!file_exists($cached_file)) {

            // create the output dir if it doesnt exist
            if (!is_dir($path) && false === @mkdir($path, 0777, true)) {
                throw new \RuntimeException('Unable to create directory ' . $path);
            }

            // apply the filters
            if ($fm->has($collection_name)) {
                $collection->ensureFilter($fm->get($collection_name));
            }

            // If not versioned, delete previous version of this file
            if (!$versions) {
                if ($filename) {
                    foreach (glob($path . '/' . $filename . $seperator . '*.' . $ext) as $searchfile) {
                        @unlink($searchfile);
                    }
                } else {
                    foreach (glob($path . '/*.' . $ext) as $searchfile) {
                        @unlink($searchfile);
                    }
                }
            }

            // put the contents in the file
            if (false === @file_put_contents($cached_file, $collection->dump())) {
                throw new \RuntimeException('Unable to write file ' . $cached_file);
            }
        }

        // return the cached file
        echo 'output: ' . $cached_file . '<br>';
    }
    exit;
    ?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接