Tuesday, June 4, 2024
 Popular · Latest · Hot · Upcoming
8
rated 0 times [  10] [ 2]  / answers: 1 / hits: 32820  / 10 Years ago, mon, march 3, 2014, 12:00:00

I'm new to gulp, but I'm wondering if its possible to iterate through directories in a gulp task.



Here's what I mean, I know a lot of the tutorials / demos show processing a bunch of JavaScript files using something like **/*.js and then they compile it into a single JavaScript file. But I want to iterate over a set of directories, and compile each directory into it's own JS file.



For instance, I have a file structure like:



/js/feature1/something.js
/js/feature1/else.js
/js/feature1/foo/bar.js
/js/feature1/foo/bar2.js
/js/feature2/another-thing.js
/js/feature2/yet-again.js


...And I want two files: /js/feature1/feature1.min.js and /js/feature2/feature2.min.js where the first contains the first 4 files and the second contains the last 2 files.



Is this possible, or am I going to have to manually add those directories to a manifest? It would be really nice to pragmatically iterate over all the directories within /js/.



Thanks for any help you can give me.



-Nate



Edit: It should be noted that I don't only have 2 directories, but I have many (maybe 10-20) so I don't really want to write a task for each directory. I want to handle each directory the same way: get all of the JS inside of it (and any sub-directories) and compile it down to a feature-based minified JS file.


More From » gulp

 Answers
28

There's an official recipe for this: Generating a file per folder



var fs = require('fs');
var path = require('path');
var merge = require('merge-stream');
var gulp = require('gulp');
var concat = require('gulp-concat');
var rename = require('gulp-rename');
var uglify = require('gulp-uglify');

var scriptsPath = 'src/scripts';

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

gulp.task('scripts', function() {
var folders = getFolders(scriptsPath);

var tasks = folders.map(function(folder) {
return gulp.src(path.join(scriptsPath, folder, '/**/*.js'))
// concat into foldername.js
.pipe(concat(folder + '.js'))
// write to output
.pipe(gulp.dest(scriptsPath))
// minify
.pipe(uglify())
// rename to folder.min.js
.pipe(rename(folder + '.min.js'))
// write to output again
.pipe(gulp.dest(scriptsPath));
});

// process all remaining files in scriptsPath root into main.js and main.min.js files
var root = gulp.src(path.join(scriptsPath, '/*.js'))
.pipe(concat('main.js'))
.pipe(gulp.dest(scriptsPath))
.pipe(uglify())
.pipe(rename('main.min.js'))
.pipe(gulp.dest(scriptsPath));

return merge(tasks, root);
});

[#72189] Saturday, March 1, 2014, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
ervindouglasm

Total Points: 451
Total Questions: 103
Total Answers: 102

Location: Turkmenistan
Member since Thu, Dec 1, 2022
2 Years ago
ervindouglasm questions
Tue, Jul 20, 21, 00:00, 3 Years ago
Wed, Jan 6, 21, 00:00, 3 Years ago
Fri, Nov 13, 20, 00:00, 4 Years ago
Tue, Oct 6, 20, 00:00, 4 Years ago
Tue, Aug 25, 20, 00:00, 4 Years ago
;