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

3

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

```javascript yo my-generator ```

则文件将被创建在上一级目录中。

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')
      );
    }
  },
1个回答

3

首先,我发现使用yeomanthis.template()比使用从mem-fs-editor包含的实例中来的this.fs.copy()/this.fs.copyTpl()更容易,但你可能有不同的看法。

无论如何,在尝试写入之前,您需要在生成器中设置this.sourceRoot('rel/path/to/source/root')this.destinationRoot('rel/path/to/dest/root'),以确保您已经设置了正确的模板和目标上下文。有关详细信息,请参见Yeoman的入门指南与文件系统交互this.destinationRoot()应相对于当前项目的根目录定义(我将在下面解释这一点),而this.sourceRoot()应相对于生成器文件的根目录定义。

此外,您还需要考虑到,yeoman将尝试找出您当前在命令行中使用的任何应用程序的根目录。它通过向上导航(例如/home/diegoaguilar/koala ->/home/diegoaguilar/)直到找到一个.yo-rc.json文件为止。然后,Yeoman将以最近的.yo-rc.json文件目录作为您项目的预期根目录,该文件目录是您运行命令的位置附近的目录。

在您的情况下,如果存在/home/diegoaguilar/.yo-rc.json,您可能希望删除/移动/重命名它。然后,您可以创建您想要项目驻留在其中的目录,并在那里运行生成器。这将如下所示:

/home/diegoaguilar/ $> mkdir koala
/home/diegoaguilar/ $> cd koala
/home/diegoaguilar/koala/ $> yo koala

如果你想或需要将你的/home/diegoaguilar/.yo-rc.json留在那里,你应该相对于/home/diegoaguilar/设置this.destinationRoot()来生成器,这样就可以写入/home/diegoaguilar/koala/了,你可以使用this.destinationRoot('koala')

@diegoaguilar 在其他地方问我为什么喜欢 this.template(),所以我想在这里也包括答案:this.template() 的主要优点是可以替代 this.fs.copy()this.fs.copyTpl(),并且默认提供当前生成器实例(即 this)作为模板上下文。如果您的文件是直接复制而没有需要进行模板化的 ejs 标记,则无论是否提供 this 都无关紧要;mem-fs-editor 将正确处理它。 - Joshua Skrzypek
唯一可能出现问题的地方是,如果您想执行this.fs.copy()并将进程选项传递给mem-fs-editor,如另一个问题的此答案中所讨论的。经过一番深入研究,我发现copyTpl()函数不允许像copy()那样使用process函数,这正是因为copyTpl()本身实际上调用了copy(),并且在process选项中已经传递了一个调用ejs.render()的函数。 - Joshua Skrzypek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接