【问题标题】:Gulp task to delete empty filesGulp 任务删除空文件
【发布时间】:2014-03-06 00:15:24
【问题描述】:

在编译 TypeScript 时,我会生成很多空的 JavaScript 文件,因为它们的 TypeScript 对应文件只包含接口。目前没有tsc 选项来禁止生成这些文件。我使用gulp-tsc插件编译。

是否有插件或其他方式来清理空文件,或者甚至是更通用的 gulp 插件,可以让我根据文件的名称和内容删除文件?或者有没有办法在不使用插件的情况下在 gulp 中做到这一点?

【问题讨论】:

    标签: javascript gulp build-process


    【解决方案1】:

    我认为您可以相对轻松地使用node-glob 来查找gulp 之外的匹配文件,如下所示:

    var glob = require('node-glob'),
        fs = require('fs);
    
    gulp.task('delete-empty-files', function(cb) {
        glob('/path/to/generated/**/*.js', function(err, files) {
            files.forEach(function(file) {
                if(fs.statSync(file).size === 0) {
                    fs.unlinkSync(file);
                }
            });
            // make sure the task runs asynchronously!
            cb();
        });
    });
    

    或者,您可以使用gulp-tap 来实现类似的结果,如下所示:

    var tap = require('gulp-tap'),
        fs = require('fs);
    
    gulp.task('delete-empty-files', function() {
        return gulp.src('/path/to/generated/**/*.js')
            .pipe(tap(function(file) {
                if(file.stat.size === 0) {
                    fs.unlinkSync(file);
                }
            });
        });
    });
    

    他们是相当平等的,真的。我认为第一个会更快,因为它不会有来自gulpvinyl-fs 的额外内容。

    可能可以将{read: false} 选项添加到gulp.src() 以加快速度,但这也可能会禁用.stat 被读取。如果你想试试,你可以这样添加:

    return gulp.src('/path/to/files/**/*.js', {read: false}).pipe(...)
    

    【讨论】:

    • 优秀。感谢您提供全面的答案并将我转到gulp-tap
    【解决方案2】:

    更好的答案是使用 .d.ts 扩展名而不是 .ts 来命名这些接口文件。以这种方式不会生成任何文件。

    【讨论】:

    • 是的,在一些情况下确实如此。碰巧经过大量实验后,我专门使用外部模块,这允许我将接口放入 .d.ts 文件中。所以为你+1。尽管如此,很可能有删除空文件的用例,所以我想保留当前接受的答案,以便那些从谷歌到达这里的人的利益,他们可能正在寻找一种删除空文件而不是解决这个 TypeScript 的方法问题。谢谢你的回答。
    • 是的 - “为您的特定用例提供更好的答案”。干杯!
    【解决方案3】:

    另外,对于其他面临类似问题的人,gulp-clip-empty-files 可以解决这个问题。

    从流中删除空文件。这可以防止其他一些错误 像 gulp-sass 这样的插件,可以用来删除占位符。

    用法很简单……

    var gulp = require('gulp');
    var clip = require('gulp-clip-empty-files');
    
    gulp.task('default', function () {
        return gulp.src('src/*.scss')
            .pipe(clip())
            .pipe(gulp.dest('dist'));
    });
    

    在此示例中,所有空的 .scss 文件在写出之前都将被“剪切”(忽略?)

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 2014-06-16
      • 1970-01-01
      • 2015-01-25
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多