我在子目录routes
中有一个typescript文件users.ts
。
gulpfile.js
:中的gullow代码
var tsProject = ts.createProject(tsConfigFile);
return tsProject.src()
.pipe(sourcemaps.init())
.pipe(ts(tsProject))
.js
.pipe(sourcemaps.write('.', {includeContent: false, sourceRoot: ''}))
.pipe(gulp.dest('.'));
gulp-sourcemaps
生成的源映射不适用于VSCode:
{"version":3,"sources":["routes/users.ts"],"names":[], "mappings":"...","file":"routes/users.js","sourceRoot":""}
tsc
生成的源映射在VSCode:中运行良好
{"version":3,"file":"users.js","sourceRoot":"","sources":["users.ts"],"names":[], "mappings":"..."}
并且VSCode断点与CCD_ 6生成的源映射良好地工作。
那么,如何配置gulp-typescript/gulp-sourcemaps
以生成与tsc
相同的源映射呢?
这与Gulp Typescript+Browserify中的问题相同;绑定的源映射指向已传输的JS,而不是源TS
将sourceRoot函数添加到sourcemaps.write(...)
假设你的.ts
文件在项目的src
文件夹中,sourcemaps
管道将看起来像:
.pipe(sourcemaps.write('.', {
sourceRoot: function(file){ return file.cwd + '/src'; }
}))
接受的答案是正确的,但我花了一些时间才意识到为什么这有效&如何根据我的特定环境调整答案(在我的情况下,我需要去掉/src
后缀)。
如果你检查生成的源映射(这只在输出到映射文件时有效,例如sourcemaps.write('.')
),你应该在json对象中看到两个字段:sources
和sourceRoot
,你需要确定两件事:
sourceRoot
应该是一个绝对路径sources
中的每个路径都应该与sourceRoot
组合,形成源文件的绝对路径
如果#1不正确,则路径在某些情况下有效,而在其他情况下无效(一些工具解析相对于源映射文件的相对路径,另一些工具基于您的工作区根、cwd或其他路径)。
如果#2不是真的,那么您的工具将在错误的位置查找源文件。
另一个提示:请记住,更改gulpfile不会触发重新运行监视模式或清除任何文件缓存,因为源文件没有更改。
Sourcemap路径在使用v-andrew方法构建它们的机器上是正确的。但是,如果您想在多台机器上编译一次源映射,请使用相对文件路径:
var path = require('path');
...
.pipe(sourcemaps.write('.', {
includeContent: false,
sourceRoot: function(file) {
var fullPath = path.join(file.cwd, file.path);
return path.relative(fullPath, file.base);
},
}))
我在Windows上使用的是gulp-sourcemaps 2.6.1,@Westy92的解决方案不起作用了(现在?),因为file.path返回绝对文件路径(包括文件名):
var path = require('path');
...
.pipe(sourcemaps.write({
includeContent: false,
sourceRoot: function(file) {
return path.relative(path.dirname(file.path), file.base);
},
}))