使用一系列插件正确映射 gulp-sourcemap



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

因此,我需要缩小每个插件,

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

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

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

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中生成文件,然后在生成后将它们移动到正确的子文件夹

但这两个似乎都是黑客。如果流首先正确创建它们会更好。有没有办法做到这一点?

我最终选择了我提到的第二个选项 - 即在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));
});

也许有一个更好的选择不是这样的黑客,但这对我有用。

相关内容

  • 没有找到相关文章

最新更新