Как выбрать самый последний файл? - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно получить самый последний файл с src в каждом подкаталоге.

Вот моя задача:

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

Есть ли способ получить самый свежий JS с gulp src?

1 Ответ

0 голосов
/ 13 мая 2019

Ну, если бы вы до сих пор не использовали gulp, то вы должны сделать что-то вроде:

  • Найдите все файлы, которые вы хотите скомпилировать
  • отправить их в метод src (который принимает строку, массив файлов или поток)

Одной из моих проблем было то, как обрабатывать путь в стиле glob, поэтому для этого я установил пакет glob npm в свой локальный пакет. Json

Затем я получил все файлы, используя glob( path, callback ), отфильтровал их в соответствии с последними изменениями, используя fs.stat и mtime или mtimeMs и сохранив только последний

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 );
    })
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...