【问题标题】:Getting gulp-sourcemaps to map correctly with a series of plugins使用一系列插件让 gulp-sourcemaps 正确映射
【发布时间】:2015-06-13 09:27:49
【问题描述】:

我有一个带有多个插件的 git 存储库(一个主要插件和几个仅用于主要插件的插件)。我正在使用 this approach 进行分发,因为 bower 没有提供一种让每个 git repo 拥有多个插件的方法。

所以,我需要缩小每个插件,为每个插件创建一个源映射,并将每个插件放入与 git 子模块相对应的单独分发文件夹中,按照惯例,我将其命名为与插件相同以使其简单.我想出了以下 Gulp 脚本,它可以一步完成,这主要基于我找到的答案 here

return gulp.src(['./jquery.dirtyforms.js', './helpers/*.js', './dialogs/*.js'], { base: './' })
    .pipe(jshint())
    .pipe(jshint.reporter(stylish))
    .pipe(rename(function (path) {
        var baseName = path.basename;
        var dirName = path.dirname;
        if (dirName == 'helpers' || dirName == 'dialogs') {
            path.basename = 'jquery.dirtyforms.' + dirName + '.' + baseName;
            console.log(path.basename);
        }
        path.dirname = path.basename;
    }))
    .pipe(gulp.dest(distributionFolder))
    .pipe(sourcemaps.init())
    .pipe(rename(function (path) {
        var baseName = path.basename;
        var dirName = path.dirname;
        if (dirName == 'helpers' || dirName == 'dialogs') {
            path.basename = 'jquery.dirtyforms.' + dirName + '.' + baseName;
            console.log(path.basename);
        }
        path.dirname = path.basename;
        path.extname = '.min.js';
    }))
    .pipe(uglify({
        outSourceMap: true,
        sourceRoot: '/'
    }))
    .pipe(gulp.dest(distributionFolder))
    .pipe(sourcemaps.write('.', {
        includeContent: true,
        sourceRoot: '/'
    }))
    .pipe(gulp.dest(distributionFolder));

它完全符合我的要求,除了一件事。为每个插件生成的 sourcemap 文件包括路径中的子目录。由于插件的最终目的地不会包含此路径,因此这是无效的。

jquery.dirtyforms.min.js.map 文件中:

{"version":3,"sources":["jquery.dirtyforms/jquery.dirtyforms.min.js"]...

应该是

{"version":3,"sources":["jquery.dirtyforms.min.js"]...

jquery.dirtyforms.min.js 文件中:

//# sourceMappingURL=../jquery.dirtyforms/jquery.dirtyforms.min.js.map

应该是

//# sourceMappingURL=jquery.dirtyforms.min.js.map

我翻遍了 gulp-sourcemaps 的源代码,试图找到一个覆盖文件名的选项,但似乎没有。

为此我想出了两个可能的解决方案:

  1. 使用正则表达式替换每个文件
  2. 生成distributionFolder中的文件,生成后移动到正确的子文件夹中

但这两种方法看起来都像是 hack。如果流首先正确地创建它们会更好。有没有办法做到这一点?

【问题讨论】:

    标签: gulp gulp-uglify gulp-sourcemaps


    【解决方案1】:

    我最终选择了我提到的第二个选项 - 即在 distributionFolder(现在为 settings.dest)中生成缩小文件,然后使用单独的复制和删除任务移动它们。

    var gulp = require('gulp'),
        uglify = require('gulp-uglify'),
        jshint = require('gulp-jshint'),
        stylish = require('jshint-stylish'),
        rename = require('gulp-rename'),
        sourcemaps = require('gulp-sourcemaps'),
        del = require('del');
    
    var settings = {
        baseProject: 'jquery.dirtyforms',
        src: ['./jquery.dirtyforms.js', './helpers/*.js', './dialogs/*.js'],
        dest: './dist/'
    };
    
    // Moves the .js files to the distribution folders and creates a minified version and sourcemap
    gulp.task('build', ['copy-minified'], function (cb) {
        del([settings.dest + '*.js', settings.dest + '*.map'], cb);
    });
    
    gulp.task('copy-minified', ['uglify'], function () {
        return gulp.src([settings.dest + '*.js', settings.dest + '*.map'], { base: './' })
            .pipe(rename(function (path) {
                console.log('moving: ' + path.basename)
                path.dirname = path.basename.replace(/\.min(?:\.js)?/g, '');
            }))
            .pipe(gulp.dest(settings.dest));
    });
    
    gulp.task('uglify', ['clean', 'test'], function () {
        return gulp.src(settings.src, { base: './' })
            .pipe(rename(function (path) {
                var baseName = path.basename;
                var dirName = path.dirname;
                if (dirName == 'helpers' || dirName == 'dialogs') {
                    path.basename = settings.baseProject + '.' + dirName + '.' + baseName;
                }
                path.dirname = path.basename;
            }))
            .pipe(gulp.dest(settings.dest))
            .pipe(sourcemaps.init())
            .pipe(rename(function (path) {
                path.dirname = '';
                path.extname = '.min.js';
            }))
            .pipe(uglify({
                outSourceMap: true,
                sourceRoot: '/'
            }))
            .pipe(gulp.dest(settings.dest))
            .pipe(sourcemaps.write('.', {
                includeContent: true,
                sourceRoot: '/'
            }))
            .pipe(gulp.dest(settings.dest));
    });
    
    // Tests the source files (smoke test)
    gulp.task('test', function () {
        return gulp.src(settings.src, { base: './' })
            .pipe(jshint())
            .pipe(jshint.reporter(stylish));
    });
    

    也许有更好的替代方案,但它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2015-03-18
      • 2020-05-14
      • 2014-03-04
      • 2014-09-18
      • 2016-03-17
      • 1970-01-01
      相关资源
      最近更新 更多