我正在创建一个Yeoman Generator,直到这一点一直正常工作。我的index.js在我的app文件夹中正确运行,生成初始结构。在该文件中,我经常使用this.fs.copy()
和this.fs.copyTpl()
,两者都运行正常。现在,我正在创建一个子发布器,根据阅读文档here的要求扩展yeoman.generators.NamedBase
。
根据我上面链接的同一页面上的文档,我的文件结构似乎是正确的。就像这样:
├───package.json
├───app/
│ └───index.js
└───view/
└───index.js
└───templates/
└───views/
└───view.html
以下是我尝试用于在项目中生成这个新“视图”的代码,该视图位于视图目录的index.js
中。
'use strict';
var yeoman = require('yeoman-generator');
module.exports = yeoman.generators.NamedBase.extend({
copyFile: function() {
this.fs.copyTpl(
'views/view.html',
'app/views/'+this.name.toLowerCase()+'.html',
{ name: this.name.toLowerCase() }
);
}
});
我跑yo {generatorname}:view helloWorld
期望它基于view.html
模板创建一个新文件,该文件非常简单:
<p>This is the <%= name %> view.</p>
当我运行该命令时,我收到以下错误。
events.js:85
throw er; // Unhandled 'error' event
^
TypeError: Cannot read property 'toString' of null
at copy.process (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy-tpl.js:11:33)
at applyProcessingFunc (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:12:16)
at EditionInterface.exports._copySingle (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:52:24)
at EditionInterface.exports.copy (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy.js:22:17)
at EditionInterface.module.exports [as copyTpl] (/Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/node_modules/mem-fs-editor/actions/copy-tpl.js:9:8)
at module.exports.yeoman.generators.NamedBase.extend.copyFile (/Users/woodruffjb/dev/yeoman/{generatorname}/view/index.js:7:11)
at /Users/woodruffjb/dev/yeoman/{generatorname}/node_modules/yeoman-generator/lib/base.js:408:16
at processImmediate [as _immediateCallback] (timers.js:358:17)
我试图查看问题是this.name
是未定义还是null,但是当我执行console.log(this.name)
时,我得到了正确的响应,即helloWorld
。在经过大量的谷歌搜索后,我能找到的唯一错误就是其他与我试图完全无关的事情,包括Atom包和Node.js服务器代码。
我能想到的是我在某种程度上错误地使用this.fs.copyTpl()
?但是,我使用它与我在app/index.js
文件中使用它完全相同,以进行初始项目设置。经过我所有的搜索,我都遇到了这个问题。根据位于here的该函数的文档,我似乎做得对。有人知道我的错误吗?
答案 0 :(得分:0)
在磁盘上找不到'views/view.html'
的可能性。
这是因为每个this.fs
方法都不会神奇地解析您的路径。安全的方法是始终提供绝对的路径。在您的情况下,您想要复制位于模板目录中的文件,因此您将使用this.templatePath('views/view.html')
来获取它的绝对路径。