Sourcemaps 位于错误的位置或路径不正确

Sourcemaps are in wrong location or have incorrect paths

我一直在努力让 gulp sass 和 gulp 源地图完全按照我的意愿行事,但我发现这很难。我想获取一个 sass 入口文件 (src/sass/index.scss),生成一个输出文件 (dist/css/index.css) 和一个单独的源映射索引文件 (dist/css/index.css.map),其中 sourceRoot 设置为项目基础(绝对路径:/home/damon/projects/test),并且 sourcemap 条目相对于该路径。

这是我尝试过的:

尝试 1:直接示例代码来自 gulp-sass:

var sassEntry = 'src/sass/index.scss';
gulp.src(sassEntry)
 .pipe(sourcemaps.init())
 .pipe(sass().on('error', sass.logError))
 .pipe(sourcemaps.write())
 .pipe(gulp.dest('dist/css'));

结果:这将 sourcemap 内联到 CSS 文件中,所以我无法判断它是否正确。

尝试 2:将其写入单独的文件

gulp.src(sassEntry)
 .pipe(sourcemaps.init())
 .pipe(sass().on('error', sass.logError))
 .pipe(sourcemaps.write('.'))
 .pipe(gulp.dest('dist/css'));

结果:写了一个单独的 sourcemap,但是 sourceRoot 说“/sources/”(WTF 是那个?!,它不存在而且我从未配置过它) 并且路径都是相对于 sass 入口文件的,而不是项目库,当我的浏览器试图找到源文件时,这也将毫无意义。

尝试 3:尝试修复 sourceroot(我也发现了 includeContent: false)

gulp.src(sassEntry)
 .pipe(sourcemaps.init())
 .pipe(sass().on('error', sass.logError))
 .pipe(sourcemaps.write('.',{includeContent: false, sourceRoot: __dirname}))
 .pipe(gulp.dest('dist/css'));

结果:sourceroot 现在是我的工作文件夹,这很好,没有包含内容,这很好,但是 sourcemap 中的文件仍然相对于 sass 入口文件而不是 sourceRoot , 所以我的地图还是没用

尝试 4:设置 gulp.src 基数

gulp.src(sassEntry, { base: __dirname })
 .pipe(sourcemaps.init())
 .pipe(sass().on('error', sass.logError))
 .pipe(sourcemaps.write('.',{includeContent: false, sourceRoot: __dirname}))
 .pipe(gulp.dest('dist/css'));

结果:令人愤怒的是,在 gulp.src 上设置基础修复了 sourcemap - sourceRoot 仍然是正确的并且源文件路径是相对于 sourceRoot 的,但它现在输出到 dist/css/ src/sass/index.css 这是错误的。卧槽!

尝试 5:使用绝对路径

gulp.src(sassEntry, { base: __dirname })
.pipe(sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(sourcemaps.write('.',{includeContent: false, sourceRoot: __dirname}))
.pipe(gulp.dest(__dirname + '/dist/css'));

结果:没有变化,仍然输出到dist中相同的深层结构。

如果有人能告诉我如何做到这一点,我将永远感激不已。

由于您的尝试 4 做了您想要的所有事情,除了将结果文件放在错误的位置,最简单的解决方法是在生成源映射后用 gulp-rename 更改该位置:

gulp.src(sassEntry, { base: __dirname })
 .pipe(sourcemaps.init())
 .pipe(sass().on('error', sass.logError))
 .pipe(sourcemaps.write('.', {includeContent: false, sourceRoot: __dirname}))
 .pipe(rename({dirname:''}))
 .pipe(gulp.dest('dist/css'));

虽然 Sven 的回答非常好,但我也通过更深入地了解 gulp 的工作原理(我试图避免)找到了我自己问题的答案,显然 gulp使用路径存储每个匹配的文件,因此添加:

{ 基数:__dirname }

在 gulp.src 中使得每个匹配的文件都具有从 base 开始的完整路径,然后使它们输出从你将 base 设置到的位置的完整相对路径。我最终得到的解决方案是使用 gulp-flatten,它从管道中的文件中删除那些相对路径,因此我最终的函数如下所示:

gulp.src(sassEntry, { base: __dirname })
.pipe(sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(sourcemaps.write('.',{includeContent: false, sourceRoot: __dirname}))
.pipe(flatten())
.pipe(gulp.dest(__dirname + '/dist/css'));

我猜,一旦你更了解它正在尝试做什么,就很容易了。