Nodejs gulp.spritesmith 大点的雪碧图 gulp.dest 保存的文件没法手动删除,干掉 node.exe 进程就可以删了,如何解决?

发布于 1周前 作者 itying888 来自 nodejs/Nestjs

Nodejs gulp.spritesmith 大点的雪碧图 gulp.dest 保存的文件没法手动删除,干掉 node.exe 进程就可以删了,如何解决?

栗子代码:

var gulp = require('gulp');
var spritesmith = require('gulp.spritesmith');


gulp.src(["大点的图片.jpg"]).pipe(spritesmith({
	imgName: 'sprite.png',
	cssName: 'sprite.css'
})).pipe(gulp.dest('output/'));

setTimeout(function(){},999999);//模拟 http server 不退出,其实是一个 http api 服务器

package.json

{
  "dependencies": {
    "gulp": "3.9.1",
    "gulp.spritesmith": "6.9.0"
  }
}

测试发现生成的图片文件大小:

  1. 比较小时,在文件管理器里面可以删掉

  2. 比较大时(测试了 300k、500k ),在文件管理器里面删不掉,连累文件夹也无法删除

  3. 直接 gulp.src(["大点的图片.jpg"]).pipe(gulp.dest('output/')) 输出的图片可以删掉

附带实验图片 http://d.hiphotos.baidu.com/zhidao/pic/item/a8773912b31bb051db0967cf307adab44aede02c.jpg (其实是多个源合并生成的文件比较大,测试直接使用一个超大的源立马复现问题)


目测是 spritesmith 的问题,但是萌新刚入门 nodejs,找不到原因,请教 v2 诸位 nodejs 大牛

有米有类似的或者就是本问题的解决办法


3 回复

这个是实验图片,500 多 k


运行生成雪碧图,恭喜,文件夹没法删除了,除非 node 退出


刚才又试了一下,一个个删除生成的文件可以删除,但全选一次性删除无法删除,不知道是不是 node 的什么奇技淫巧 (滑稽
直接删除文件夹是 100%无法删除的


自己解决了,在 gulp.dest 前面加上一层 pipe(buffer())就没有这个问题了

直接用的 GitHub readme 上的例子没有这个问题,加个 buffer 又导入了一个包,咳!

针对你提到的在使用 gulp.spritesmith 生成大雪碧图时,gulp.dest 保存的文件无法手动删除,需要杀掉 node.exe 进程的问题,这通常是由于文件被 Node.js 进程锁定导致的。以下是一些可能的解决方案:

  1. 确保文件释放: 确保在 gulp 任务中,所有对文件的操作(如读取、写入等)都已完成并正确关闭文件描述符。可以通过使用 async/await 或 Promise 来确保异步操作的完成。

  2. 使用 gulp-uncache 插件: 可以尝试使用 gulp-uncache 插件来避免缓存导致的文件锁定问题。虽然这主要用于缓存管理,但有时也能解决文件锁定的问题。

  3. 检查并关闭其他进程: 确保没有其他进程(如编辑器、IDE 或其他命令行工具)正在使用或锁定这些文件。

  4. 代码示例: 下面是一个简单的 gulp 任务示例,展示如何生成雪碧图并确保文件正确写入:

    const gulp = require('gulp');
    const spritesmith = require('gulp.spritesmith');
    
    gulp.task('generate-sprites', async function () {
      const spriteData = await gulp.src('path/to/images/*.png')
        .pipe(spritesmith({
          imgName: 'sprite.png',
          cssName: 'sprite.css'
        }));
    
      gulp.src(spriteData.css)
        .pipe(gulp.dest('path/to/output/'));
      gulp.src(spriteData.img)
        .pipe(gulp.dest('path/to/output/'));
    });
    

    确保在任务完成后,所有文件都已正确写入并关闭。

如果以上方法仍无法解决问题,可能需要更深入地检查你的代码和配置。

回到顶部