【问题标题】:gulp-concat : from unknown source to the same destinationgulp-concat : 从未知来源到同一个目的地
【发布时间】:2015-12-16 22:43:19
【问题描述】:

我最近开始使用 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/anySubFolder/src/assets/js 中的每个 js 文件,将它们放在一起,将新创建的 js 重命名为“all.js”,然后将其公开/js。问题是我想让 gulp 保持文件夹层次结构,例如:

来源 = vendor/proj/anyFolder1/anySubFolder1/src/assets/js/*.js
目的地 = public/js/anyFolder1/anySubFolder1/src/assets/js/all.js

来源 = vendor/proj/anyFolder1/anySubFolder2/src/assets/js/*.js
目的地 = public/js/anyFolder1/anySubFolder2/src/assets/js/all.js

而不是简单地将这些文件夹中的所有内容放入 1 并且只有 public/js/all.js

有什么办法吗?我尝试先用谷歌搜索它,但我无法用几句话正确地表达我的问题,并且得到了不想要的结果:/

【问题讨论】:

    标签: javascript gulp gulp-concat


    【解决方案1】:

    您可以创建保持文件夹层次结构的功能。在此页面 (http://www.jamescrowley.co.uk/2014/02/17/using-gulp-packaging-files-by-folder/) 中,您可以找到解决方案。

    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);
    });
    

    【讨论】:

    • 遗憾的是这不起作用:/我得到一个:错误:ENOENT,没有这样的文件或目录'C:\dev\journey5.1\vendor\proj\**\**\src\ assets\js' 因为我的 scriptsPath 未知(/**/**/可能是任何项目/子项目,我无法提前知道它会是什么)
    • 你试过用scriptsPath = './vendor/proj/'; ? (这个方法是递归的)
    【解决方案2】:

    感谢@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);
    });
    

    TL:DR = 获取 pathToPublic/someFolder/someFolder/PathToJS 中的每个 JS 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      相关资源
      最近更新 更多