我正在使用node.js上的gulp
和hercule
包来包含一些纯文本文件。在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);
});
node
和npm
版本信息:$ 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()
}