如何选择最新文件?

时间:2019-05-12 19:26:50

标签: javascript gulp

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

这是我的任务:

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

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

1 个答案:

答案 0 :(得分:0)

好吧,到目前为止,还没有真正使用过gulp,您应该做的事情如下:

  • 找到您要编译的所有文件
  • 将它们发送到src方法(采用字符串,文件数组或流的方法)

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

然后我要做的是,使用glob( path, callback )获取所有文件,根据使用fs.statmtimemtimeMs进行最后修改的文件进行过滤,只保留最后一个

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 );
    })
  });
});