使用gulp-if有条件地使用函数

时间:2018-05-17 21:41:28

标签: gulp

我试图在生产中有条件地更改JS文件的路径。我使用gulp-inject-stringgulp-if来调用插入远程路径的函数+一系列html文件的父文件夹名称:

```
...(require a bunch of stuff here)...
var inject = require('gulp-inject-string');

function getFolders(dir) {
    return fs.readdirSync(dir)
        .filter(function(file) {
            return fs.statSync(path.join(dir, file)).isDirectory();
        });
}

function injectAfterEach(src) {
    var folders = getFolders(config.root.dest);

    var tasks = folders.map(function(folder) {
        if (folder !== 'base') {
            var fullPath = path.join(config.remotePath, folder, '/');
            console.log('folder: ' + fullPath);
            return gulp.src(src)
                .pipe(inject.afterEach('<script src="', fullPath))
                .pipe(gulp.dest(config.tasks.html.dest))
        }
    });
    return tasks;
}

gulp.task('html', function() {

    return gulp.src(config.tasks.html.src)
        .pipe(gulpif(process.env.NODE_ENV == 'production', injectAfterEach(config.tasks.html.src) ))
        .pipe(gulpif(process.env.NODE_ENV == 'production', removeCode({ production: true })))
        .pipe(gulpif(process.env.NODE_ENV == 'production', htmlmin(config.tasks.html.htmlmin)))
        .pipe(gulp.dest(config.tasks.html.dest))
        .pipe(browserSync.stream());
});
```

我一直得到一个&#34; dest.on不是一个功能&#34;错误,我想这是因为我的injectAfterEach没有返回stream.Transform对象?有人可以澄清有条件地运行该功能的最佳方法吗?我的吞咽有点摇摇欲坠,但我试图引用api docs这个特定的用例。

1 个答案:

答案 0 :(得分:0)

我想你想要的东西如下。我已经简化了一些事情,所以我可以测试它。

第一点:您的getFolders()功能可以轻松替换为glob.sync(),请参阅电话glob options。由于你显然只想要文件夹,所以glob调用的glob模式必须以“/”结尾,即path.sep

返回流的关键点是使用gulp-merge,它允许您返回每个folders.map各个流的合并流。

const gulp = require('gulp');
const path = require('path');
const merge = require('gulp-merge');
const gulpif = require('gulp-if');
const glob = require("glob");
const inject = require('gulp-inject-string');


function injectAfterEach(src) {

  const folders = glob.sync(src);
  console.log(folders);

  return merge(folders.map(function (folder) {

    console.log("folder basename = " + path.basename(folder));

    if (path.basename(folder) !== 'base') {

      let fullPath = path.join("RemotePath", path.sep, path.basename(folder), path.sep);
      console.log('fullPath: ' + fullPath);

        return gulp.src(path.join(folder, '*.html') )
            .pipe(inject.afterEach('<script src="', fullPath))
            .pipe(gulp.dest('dist'))
      }
  }));
}

gulp.task('default', function() {

  return gulp.src('./htmlFolder')

    .pipe(gulpif(true, injectAfterEach('./htmlFolders/**/')))

      // just commented out for testing
      // .pipe(gulpif(process.env.NODE_ENV == 'production', removeCode({ production: true })))
      // .pipe(gulpif(process.env.NODE_ENV == 'production', htmlmin(config.tasks.html.htmlmin)))
      .pipe(gulp.dest('dist'))
      // .pipe(browserSync.stream());
});