首页 > 解决方案 > 如何选择最新的文件?

问题描述

src我需要在每个子目录中获取最新的文件。

这是我的任务:

gulp.task('compile', function() {
  return gulp.src('src/jade/**/*.js')
    .pipe(jade({pretty: true}))
    .pipe(gulp.dest('dist'));
});

有没有办法用 gulp src 获得最新鲜的 JS?

标签: javascriptgulp

解决方案


好吧,到目前为止还没有真正使用过 gulp,你应该做的是:

  • 找到你要编译的所有文件
  • 将它们发送到src方法(接收字符串、文件数组或流)

我的问题之一是如何处理 glob 样式路径,因此我glob在本地 package.json 中安装了 npm 包

然后我所做的是,使用 获取所有文件glob( path, callback ),根据最后修改的使用过滤这些文件fs.statmtimeormtimeMs并且只保留最后一个

const { src, dest } = require('gulp');
const glob = require('glob');
const path = require('path');
const fs = require('fs');

async function getFileLastModifiedBy( file ) {
  return new Promise( (resolve, reject) => {
    fs.stat( file, (err, stats) => {
      if (err) {
        reject( err );
        return;
      }
      resolve( stats.mtimeMs );
    });
  } );
}

async function filterByNewest( input ) {
  const filesByModifiedBy = {};
  for (let file of input) {
    let directory = path.dirname( file );
    let lastModifiedBy = await getFileLastModifiedBy( file );
    if (!filesByModifiedBy[directory] || filesByModifiedBy[directory].lastModifiedBy < lastModifiedBy) {
      filesByModifiedBy[directory] = { file, lastModifiedBy };
    }
  }
  return Object.values( filesByModifiedBy ).map( v => v.file );
}

然后您可以通过以下方式将其与您当前的工作流程集成

gulp.task('compile', function() {
  return new Promise( (resolve, reject) => {
    glob('src/jade/**/*.js', async function( err, files ) {
      if ( files ) {
        const newest = await filterByNewest( files );
        resolve( 
          src( newest )
            .pipe(jade({pretty: true}))
            .pipe(dest('dist'))
        );
        return;
      }
      reject( err );
    })
  });
});

推荐阅读