Yeoman发电机可以更新现有文件吗?

Rem*_*emy 30 yeoman yeoman-generator

所以只是为了给你一些上下文,我正在尝试创建一个生成器,它将创建一些文件(当然基于用户输入)以及更新项目中的一些现有文件(例如添加新路径).

使用创建文件this.template没有问题......问题是:有没有办法用Yeoman做这个,而不必使用Node读取文件并做一些奇特的查找和替换?

Rem*_*emy 25

好的,所以我找到了问题的答案.

Addy Osmani向我展示了在twitter上查看这个帖子的位置,然后我发现这个链接显示了我需要的内容.

它的要点归结为两个功能:readFileAsStringwrite.用法如下:

var path = "/path/to/file.html",
    file = this.readFileAsString(path);

/* make modifications to the file string here */

this.write(path, file);
Run Code Online (Sandbox Code Playgroud)

编辑:我也在我的博客上写过这篇博文.

 编辑1

正如Toilal在评论中提到的那样:

write方法不再存在,必须替换为writeFileFromString(参数也相反) - Toilal

编辑2

然后,正如ivoba的评论中提到的那样:

this.writeFileFromString&this.readFileAsString不推荐使用,github.com/yeoman/html-wiring现在应该使用,事情发生变化:) - ivoba

  • write方法不再存在,必须由writeFileFromString替换(参数也相反) (7认同)
  • `html-wiring` 也已弃用。 (2认同)

sep*_*ans 22

Yeoman还使用mem-fs-editor提供了一种更优雅的fs操作方式.

您可以使用this.fs.copy,将流程函数作为选项传递给内容进行任何修改:

this.fs.copy(path, newPath, {
    process: function(content) {

        /* Any modification goes here. Note that contents is a Buffer object */

        var regEx = new RegExp('old string', 'g');
        var newContent = content.toString().replace(regEx, 'new string');
        return newContent;
    }
});
Run Code Online (Sandbox Code Playgroud)

这样您还可以利用mem-fs-editor功能.


Wto*_*wer 5

结合@sepans的优秀答案,我们可以使用一些解析器,而不是使用正则表达式。

来自 Yeoman文档

提示:更新现有文件的内容

更新预先存在的文件并不总是一项简单的任务。最可靠的方法是解析文件AST并编辑它。此解决方案的主要问题是编辑 AST 可能很冗长并且有点难以掌握。

一些流行的 AST 解析器是:

使用 RegEx 解析代码文件是一条危险的道路,在这样做之前,您应该阅读此CS 人类学答案并掌握 RegEx 解析的缺陷。如果您选择使用 RegEx 而不是 AST 树编辑现有文件,请小心并提供完整的单元测试。- 请不要破坏您的用户的代码。

更具体地说,当使用 esprima 时,您很可能还需要一些生成器(例如escodegen)来生成 js。

var templatePath = this.destinationPath(...);
this.fs.copy(templatePath, templatePath, {
  process: function (content) {
    // here use the parser
    return ...
  }
});
Run Code Online (Sandbox Code Playgroud)

from请注意,您可以在,参数中使用相同的路径to来替换现有文件。

另一方面,此类解析器的缺点是,在某些情况下,它可能会过多地改变原始文件,虽然安全,但更具侵入性。