所以只是为了给你一些上下文,我正在尝试创建一个生成器,它将创建一些文件(当然基于用户输入)以及更新项目中的一些现有文件(比如添加一条新路线。)
使用this.template
创建文件没问题......问题是:有没有办法用Yeoman做这个,而不必使用Node读取文件并做一些幻想的查找和替换?
答案 0 :(得分:25)
好的,所以我找到了问题的答案。
Addy Osmani向我展示了在this thread on twitter中查看的位置,然后我发现this link显示了我需要的内容。
它的要点归结为两个功能:readFileAsString
和write
。用法如下:
var path = "/path/to/file.html",
file = this.readFileAsString(path);
/* make modifications to the file string here */
this.write(path, file);
编辑:我也在博客上发表了这篇文章on my blog。
正如Toilal的评论中提到的那样:
write
方法不再存在,必须由writeFileFromString
替换(参数也相反) - Toilal
然后,正如ivoba的评论中提到的那样:
this.writeFileFromString
&this.readFileAsString
已被弃用,现在应该使用github.com/yeoman/html-wiring,事情会发生变化:) - ivoba
答案 1 :(得分: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;
}
});
这样您还可以利用mem-fs-editor
功能。
答案 2 :(得分:3)
与@ sepans'结合使用优秀的答案,而不是使用正则表达式,可以使用一些解析器。
来自Yeoman documentation:
提示:更新现有文件的内容
更新预先存在的文件并不总是一项简单的任务。最可靠的方法是解析文件AST并进行编辑。这个解决方案的主要问题是编辑AST可能很冗长,而且有点难以掌握。
一些流行的AST解析器是:
- Cheerio用于解析HTML。
- Esprima用于解析JavaScript - 您可能对AST-Query感兴趣,它提供了一个较低级别的API来编辑Esprima语法树。
- 对于JSON文件,您可以使用原生JSON object methods。
使用RegEx解析代码文件是一条危险的路径,在此之前,您应该阅读此CS anthropological answers并掌握RegEx解析的缺陷。如果您确实选择使用RegEx而不是AST树编辑现有文件,请小心并提供完整的单元测试。 - 请,请不要打破你的用户'代码。
更具体地说,当使用esprima时,你很可能还需要一些生成器,例如escodegen来生成js。
var templatePath = this.destinationPath(...);
this.fs.copy(templatePath, templatePath, {
process: function (content) {
// here use the parser
return ...
}
});
请注意,您可以在from
,to
参数中使用相同的路径来替换现有文件。
另一方面,这种解析器的缺点是,在某些情况下,它可能会过多地改变原始文件,虽然安全,但这更具侵入性。
答案 3 :(得分:1)
您可以使用mem-fs-editor,然后调用Future<String> getUserUID() async {
return (await _firebaseAuth.currentUser()).uid;
}
方法。
例如
fs.append(filepath, contents, [options])
答案 4 :(得分:0)
使用var text = this.fs.read(filePath)
读取文件,并使用this.fs.write(filePath, content)
写入位置的文件。