Javascript 吞食浓缩物:从未知来源到同一目的地
我最近开始使用gulp来组织我的开发项目,我遇到了一些我无法理解的小问题。这就是我的任务:Javascript 吞食浓缩物:从未知来源到同一目的地,javascript,gulp,gulp-concat,Javascript,Gulp,Gulp Concat,我最近开始使用gulp来组织我的开发项目,我遇到了一些我无法理解的小问题。这就是我的任务: gulp.task('jsassemble', function () { return gulp .src('vendor/proj/**/**/src/assets/js/*.js') .pipe(concat('all.js')) .pipe(gulp.dest('public/js')); }); 如您所见,它将获取vendor/proj/anyFolder/anySub
gulp.task('jsassemble', function () {
return gulp
.src('vendor/proj/**/**/src/assets/js/*.js')
.pipe(concat('all.js'))
.pipe(gulp.dest('public/js'));
});
如您所见,它将获取vendor/proj/anyFolder/anySubFolder/src/assets/js中的每个js文件,将它们放在一起,将新创建的js重命名为“all.js”,然后将其放在public/js中。问题是我想让gulp保留文件夹层次结构,例如:
Source=vendor/proj/anyFolder1/anySubFolder1/src/assets/js/*.jsDestination=public/js/anyFolder1/anySubFolder1/src/assets/js/all.js Source=vendor/proj/anyFolder1/anySubFolder2/src/assets/js/*.js
Destination=public/js/anyFolder1/anySubFolder2/src/assets/js/all.js 而不是简单地将这些文件夹中的所有内容都放在1中,并且只有public/js/all.js
有什么办法吗?我曾尝试先在谷歌上搜索,但我无法用几句话恰当地表达我的问题,并且得到了不想要的结果://您可以创建保持文件夹层次结构的函数。在本页()中,您可以找到解决方案
var fs = require('fs');
var path = require('path');
var es = require('event-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'))
.pipe(concat(folder + '.js'))
.pipe(gulp.dest(scriptsPath))
.pipe(uglify())
.pipe(rename(folder + '.min.js'))
.pipe(gulp.dest(scriptsPath));
});
return es.concat.apply(null, tasks);
});
感谢@caballerog让我走上了正确的道路,下面是解释代码:
//get every folder from a 'pathTo/Something'
function getFolders(dir){
return fs.readdirSync(dir)
return fs.statSync(path.join(dir, file)).isDirectory();
}
var projectsRoot = 'vendor/proj/';
var pathToJsFiles = '/src/assets/js/';
var pathToPublic = 'public/js/';
gulp.task('scripts', function() {
var sites = [];
var pathToProjects = [];
// Fetching every folders in vendor/proj
projects = getFolders(projectsRoot);
// Fetching every subfolder in vendor/proj/something
for(index in projects){
sites.push(getFolders(projectsRoot + '/' + projects[index]));
}
// Pushing every projects/site that exists into an array
for(var i=0;i<projects.length;i++){
for(var j=0; j<sites.length; j++)
if(sites[i][j] != null)
pathToProjects.push(projects[i] + '/' + sites[i][j]);
}
// Fetching every JS on vendor/proj/pathToAProject/pathToJsFiles
// concatenate them together
// and sending them to pathToPublic/pathToAProject/all.js
var tasks = pathToProjects.map(function(pathToAProject) {
return gulp.src( projectsRoot + pathToAProject + pathToJsFiles + '/*.js')
.pipe(concat('all.js'))
.pipe(gulp.dest(pathToPublic + pathToAProject));
});
return es.concat.apply(null, tasks);
});
//从“路径到/Something”获取每个文件夹
函数getFolders(dir){
返回fs.readdirSync(dir)
返回fs.statSync(path.join(dir,file)).isDirectory();
}
var projectsRoot='vendor/proj/';
var pathToJsFiles='/src/assets/js/';
var pathToPublic='public/js/';
gulp.task('scripts',function()){
var位点=[];
var pathToProjects=[];
//获取供应商/项目中的每个文件夹
projects=getFolders(projectsRoot);
//正在获取供应商/proj/something中的每个子文件夹
用于(项目中的索引){
push(getFolders(projectsRoot+'/'+项目[索引]);
}
//将存在的每个项目/站点推送到阵列中
对于(var i=0;我想这不起作用):/我得到了一个:错误:eNONT,没有这样的文件或目录'C:\dev\journey5.1\vendor\proj\***\***\src\assets\js',因为我的scriptsPath未知(该/***/***/可以是任何项目/子项目,我无法预先告诉它将是什么),您是否尝试使用scriptsPath='。/vendor/proj/'?(此方法是递归的)