Node.js 与NodeJ一起使用时,生成的coffee sourcemaps的路径不正确

Node.js 与NodeJ一起使用时,生成的coffee sourcemaps的路径不正确,node.js,coffeescript,gruntjs,source-maps,Node.js,Coffeescript,Gruntjs,Source Maps,我正在用coffeescript做一些工作。coffeescript通过grunt编译成js,并与一个简单的nodejsexpress应用程序一起使用 我的文件夹结构确实遵循公共文件夹的结构,其中有一个资产文件夹,用于存放要编译的内容(coffeescript,stylus),还有一个公用文件夹,用于存放已编译的内容(js,css): 我的coffee在grunt中的设置是: coffee: client: options: sourceMap: true #

我正在用
coffeescript
做一些工作。
coffeescript
通过
grunt
编译成
js
,并与一个简单的
nodejs
express应用程序一起使用

我的文件夹结构确实遵循公共文件夹的结构,其中有一个
资产
文件夹,用于存放要编译的内容(
coffeescript
stylus
),还有一个公用文件夹,用于存放已编译的内容(
js
css
):

我的
coffee
grunt
中的设置是:

coffee:
  client:
    options:
      sourceMap: true
      #sourceRoot: '??'
    files: [
      expand:   true
      cwd:      'assets/coffee/'
      src:      ['**/*.coffee']
      dest:     'public/js/'
      ext:      '.js'
    ]
为了从assets目录中提供文件,我在我的express应用程序中将此目录添加为静态目录:

app.use express.static(process.cwd() + '/assets')
Chrome可以正确识别源地图,但咖啡文件的位置是错误的。例如,url看起来像
http://localhost:3000/assets/coffee/main.coffee
。当然,这会导致404,因为
资产
是所有
咖啡
文件的根目录,并由我的express应用程序提供服务

因此,我需要调整
sourceRoot
变量

  • 如果我将
    sourceRoot
    设置为
    sourceRoot:'/assets/'
    ,Chrome会生成指向
    http://localhost:3000/assets/main.coffee
  • 如果我将其设置为
    sourceRoot:'/coffee/'
    则链接为
    http://localhost:3000/coffee/main.coffee
    。这适用于
    资产/coffee/
    中的文件。未找到
    assets/coffee/
    子目录中的文件,如
    assets/coffee/lib/
    (生成的链接为
    http://localhost:3000/coffee/util.coffee
设置
sourceRoot
选项似乎会删除文件夹结构

长问题短:
sourceRoot
的正确设置是什么?如何保留文件夹结构



我将此问题作为可能的错误报告提交:

这似乎实际上是CoffeeScript Grunt任务中的一个错误

见:

在这里,如果options对象有一个“sourceRoot”元素,它将覆盖由该函数创建的生成的sourceRoot:

var createOptionsForFile=函数(文件、路径){
返回{
代码:grunt.file.read(文件),
sourceFiles:[path.basename(文件)],
sourceRoot:appendTrailingSlash(path.relative(path.destDir,path.dirname(文件)))
};
};
它使用从目标目录到源文件所在位置的相对路径(如果您将/js映射到/public/js,这可能会起作用,但对于您来说,路径中将有一个额外的../)

对于您的情况,如果您修改了代码,以便将
options=\uu.extend({…
代码替换为以下内容,则可能会起作用:

var newRoot=未定义
如果(options.sourceRoot)newRoot=appendTrailingSlash(path.join(options.sourceRoot,path.dirname(文件));
选项=\扩展({
generatedFile:path.basename(path.dest),
sourceRoot:mapOptions.sourceRoot,
sourceFiles:mapOptions.sourceFiles
},选项);
if(newRoot)options.sourceRoot=newRoot;
我认为这会起作用,因为
file
应该与
cwd
设置相关

如果对Grunt任务的更改有效,那么制作一个更干净的版本并提交一个pull请求是值得的,因为我认为如果.coffee文件位于目录树中,那么应该在sourcemaps的sourceRoot属性中反映出来

app.use express.static(process.cwd() + '/assets')
options = _.extend({
    generatedFile: path.basename(paths.dest),
    sourceRoot: mapOptions.sourceRoot,
    sourceFiles: mapOptions.sourceFiles
  }, options);