我试图在生产中有条件地更改JS文件的路径。我使用gulp-inject-string
和gulp-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这个特定的用例。
答案 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());
});