我正在使用node.js上的hercule
和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)
我已经用hercule@3.0.5
以及hercule@2.0.5
尝试上面的hercule@2.0.5
,并且这两个包都给出了上面的错误。 但是,鉴于这只发生在Windows上,并在许多版本的软件包,我怀疑这个问题有什么应该由于Node.js安装或path 。
使用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() }