Javascript 如何设置自定义生成器文件的目标路径?
我正在构建一个自定义的yeoman生成器,因此当需要创建文件时,它们会在我当前位置上方的一个目录中创建,或者在Javascript 如何设置自定义生成器文件的目标路径?,javascript,yeoman,yeoman-generator,Javascript,Yeoman,Yeoman Generator,我正在构建一个自定义的yeoman生成器,因此当需要创建文件时,它们会在我当前位置上方的一个目录中创建,或者在。,例如,如果我运行: yo koala 从/home/diegoaguilar/koala将在/home/diegoaguilar创建文件。我应该如何告诉生成器复制文件的路径?我真的认为那将是process.cwd(),或者仅仅是运行yeoman生成器的地方 这是我获得的文件生成代码: writing: { app: function () { this.fs
。
,例如,如果我运行:
yo koala
从/home/diegoaguilar/koala
将在/home/diegoaguilar
创建文件。我应该如何告诉生成器复制文件的路径?我真的认为那将是process.cwd()
,或者仅仅是运行yeoman生成器的地方
这是我获得的文件生成代码:
writing: {
app: function () {
this.fs.copyTpl(
this.templatePath('_package.json'),
this.destinationPath('package.json'),
{appname: this.appname}
);
this.fs.copy(
this.templatePath('_bower.json'),
this.destinationPath('bower.json')
);
},
projectfiles: function () {
this.fs.copy(
this.templatePath('editorconfig'),
this.destinationPath('.editorconfig')
);
this.fs.copy(
this.templatePath('jshintrc'),
this.destinationPath('.jshintrc')
);
}
},
首先,我发现使用yeoman
的this.template()
,而不是使用this.fs.copy()
/this.fs.copyTpl()
,它们来自的包含实例,但是YMMV
无论如何,在尝试写入之前,需要在生成器中设置this.sourceRoot('rel/path/to/source/root')
和this.destinationRoot('rel/path/to/dest/root')
,以确保设置了正确的模板和目标上下文。this.destinationRoot()
应该相对于当前项目的根目录定义(我在下面解释),而this.sourceRoot()
应该相对于生成器文件的根目录定义
你还必须考虑到,约曼会尝试找出你在命令行中的任何应用程序的根目录。它通过向上导航(即
/home/diegoaguilar/koala
->/home/diegoaguilar/
)直到找到.yo rc.json
文件。然后,Yeoman将最近的.yo rc.json
目录作为项目的预期根目录
在您的情况下,您可能需要删除/move/rename/home/diegoaguilar/.yo rc.json
(如果存在)。然后,您可以创建希望项目位于其中的目录,并在其中运行生成器。这看起来像
/home/diegoaguilar/ $> mkdir koala
/home/diegoaguilar/ $> cd koala
/home/diegoaguilar/koala/ $> yo koala
如果您想或需要将
/home/diegoaguilar/.yo rc.json
留在那里,您应该在生成器中设置this.destinationRoot()
,相对于/home/diegoaguilar/
,以便写入/home/diegoaguilar/koala/
您将使用this.destinationRoot('koala'))@diegoaguilar在别处问我为什么喜欢这个.template()
,所以我想我也应该在这里给出答案:这个.template()
的主要优点是你可以用它来代替这个.fs.copy()
和这个.fs.copyTpl()
,它默认提供当前生成器实例(即this
)作为模板上下文。如果您的文件是直接副本,没有要模板化的ejs
标记,那么是否提供this
并不重要mem fs editor
将正确处理它。唯一可能出现问题的地方是,如果要执行this.fs.copy()
并将流程选项传递给mem fs editor
,如中所述。深入研究后,我发现copyTpl()
函数不允许像copy()
这样的进程
函数,因为copyTpl()
本身实际上调用copy()
,并且本身已经在进程
选项中传递了一个调用ejs.render()
的函数。