我正在使用node.js上的gulphercule包来包含一些纯文本文件。在Unix上,一切似乎都可以正常工作。但是,某些同事在Windows上运行它时遇到了问题。他们仅在Windows上运行时才收到以下错误消息:

[13:02:01] TypeError: Cannot read property 'toString' of null at Object.transcludeStringSync (D:\project\node_modules\hercule\lib\hercule.js:136:36)

我已经使用[email protected][email protected]尝试了上述方法,并且两个软件包都给出了以上错误。但是,鉴于这种情况仅发生在Windows以及该软件包的许多版本中,我怀疑此问题与Node.js的安装或路径有关。

使用hercule包的代码:
var fs = require('fs');
var path = require('path');
var gulp = require('gulp');
var drakov = require('drakov');
var hercule = require('hercule');

gulp.task('mock', ['i18n','build_minify_no_tests'], function() {
    var mockSpecificationTemplate= fs.readFileSync('test/mock/mock-template.apib','utf8');
    var transcludedMockSpecification = hercule.transcludeStringSync(mockSpecificationTemplate, {
        relativePath: path.resolve('../../../')
    });
    fs.writeFileSync('test/mock/mock.apib', transcludedMockSpecification, 'utf-8');

    // Running mock server
    var drakovArgv = {
        sourceFiles: 'test/mock/mock.apib',
        serverPort: 9000,
        staticPaths: [
            '../../'
        ],
        discover: true,
        watch: true
    };
    drakov.run(drakovArgv);
});
nodenpm版本信息:
$ node -v
v6.3.0
$ npm -v
3.10.3

最佳答案

hercule.transcludeStringSync只需运行另一个hercule进程并将输入发送给它:

const result = childProcess.spawnSync('../bin/hercule', syncArgs, syncOptions);

使用脚本../bin/hercule:
#!/usr/bin/env node

"use strict";

require('../lib/main.js');

...显然不适用于Windows

如果必须同步该任务,则可以改用以下功能:
function transcludeStringSync(input, options) {
  const {dirname, join} = require('path')
  const hercule = join(dirname(require.resolve('hercule')), 'main')
  const args = [hercule, '--reporter', 'json-err']
  for (let name in options) {
    args.push(`--${name}`, `--${options[name]}`)
  }
  const result = require('child_process').spawnSync('node', args, {input})
  const err = result.stderr.toString()
  if (err) throw new Error('Could not transclude input')

  return result.stdout.toString()
}

09-19 16:15