Javascript 如何设置自定义生成器文件的目标路径?

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

我正在构建一个自定义的yeoman生成器,因此当需要创建文件时,它们会在我当前位置上方的一个目录中创建,或者在
,例如,如果我运行:

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()
的函数。