1

coffeescript用来做一些工作。它coffeescript被编译成一个简单的快速应用程序js并提供服务。gruntnodejs

我的文件夹结构确实遵循普通文件夹结构,其中包含一个assets用于要编译的内容的文件夹(coffeescript, stylus)和一个包含已编译内容的公用文件夹(js, css):

/
-- 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 可以正确识别源地图,但咖啡文件的位置是错误的。例如,一个 url 看起来像http://localhost:3000/assets/coffee/main.coffee. 当然,这会导致 404,因为assets它是所有文件的根目录,coffee并且由我的 express 应用程序提供服务。

所以我需要调整sourceRoot变量。

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

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

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


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

4

1 回答 1

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

在这里,如果选项对象有一个“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 文件位于目录树中,那应该反映在源映射的 sourceRoot 属性中。

于 2013-07-27T00:14:58.693 回答