使用nodejs时生成的咖啡源图的路径不正确

时间:2013-07-19 14:15:47

标签: node.js coffeescript gruntjs source-maps

我正在使用coffeescript做一些工作。 coffeescript使用js汇编到grunt,并使用简单的nodejs快递应用。

我的文件夹结构遵循常见的文件夹,其中assets文件夹用于编译事物(coffeescriptstylus)和包含已编译内容的公用文件夹(jscss):

/
-- assets /
          -- coffee /
                    -- lib /
                           -- util.coffee
                    -- main.coffee
          -- styl
-- public /
          -- css
          -- js /
                -- lib /
                       -- util.js
                -- main.js

coffee中的grunt设置为:

coffee:
  client:
    options:
      sourceMap: true
      #sourceRoot: '??'
    files: [
      expand:   true
      cwd:      'assets/coffee/'
      src:      ['**/*.coffee']
      dest:     'public/js/'
      ext:      '.js'
    ]

要从资产目录提供文件,我将其添加为我的快递应用程序中的静态目录:

app.use express.static(process.cwd() + '/assets')

Chrome正确识别出源地图,但咖啡文件的位置错误。例如,网址看起来像http://localhost:3000/assets/coffee/main.coffee。当然这会产生404,因为assets是所有coffee文件的根,并且由我的快递应用程序提供。

所以我需要调整sourceRoot变量。

  • 如果我将sourceRoot设置为sourceRoot: '/assets/',则Chrome会生成指向http://localhost:3000/assets/main.coffee的链接。
  • 如果我将其设置为sourceRoot: '/coffee/',则链接为http://localhost:3000/coffee/main.coffee。这适用于assets/coffee/中的文件。找不到assets/coffee/的子目录中的文件,例如assets/coffee/lib/(生成的链接为http://localhost:3000/coffee/util.coffee

设置sourceRoot选项似乎删除了文件夹结构?!

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


我将此问题作为可能的错误报告提交:https://github.com/jashkenas/coffee-script/issues/3075

1 个答案:

答案 0 :(得分:0)

这似乎是CoffeeScript Grunt任务中的一个错误。

请参阅:https://github.com/gruntjs/grunt-contrib-coffee/blob/master/tasks/coffee.js#L87

options = _.extend({
    generatedFile: path.basename(paths.dest),
    sourceRoot: mapOptions.sourceRoot,
    sourceFiles: mapOptions.sourceFiles
  }, options);

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

https://github.com/gruntjs/grunt-contrib-coffee/blob/master/tasks/coffee.js#L130

var createOptionsForFile = function (file, paths) {
  return {
    code: grunt.file.read(file),
    sourceFiles: [path.basename(file)],
    sourceRoot: appendTrailingSlash(path.relative(paths.destDir, path.dirname(file)))
  };
};

使用从目标目录到源文件所在位置的相对路径(如果将/ js之类的内容映射到/ public / js,可能会有效,但对于你来说,将会有额外的../路径)。

对于您的情况,如果您修改了代码以便用以下内容替换options = _.extend({...代码,它可能会有效:

var newRoot = undefined
if (options.sourceRoot) newRoot = appendTrailingSlash(path.join(options.sourceRoot, path.dirname(file)));
options = _.extend({
    generatedFile: path.basename(paths.dest),
    sourceRoot: mapOptions.sourceRoot,
    sourceFiles: mapOptions.sourceFiles
  }, options);
if (newRoot) options.sourceRoot = newRoot;

我认为这样可行,因为file应该与您的cwd设置相关。

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