如何使用fs动态读取ts文件和更新代码?
how to read ts file and update code dynamically using fs?
我正在使用 yeoman 生成器构建新项目,它正在创建所有目录和 运行 依赖项,现在一旦生成文件,我想更新 js class 与 appName 相同,
首先,我试图读取 ts 文件,但我没有这样做,它会抛出错误 TypeError: Cannot read property 'toString' of undefined
然后我会用 appName 更新文件,如果有更好的方法来完成这个任务,我会感谢帮助。
index.js
updateTsFile () {
const npmdir = `${process.cwd()}/${this.props.appName}`;
const dirPath = `${npmdir}/${"./api.ts"}`;
console.log("path", dirPath);
let response;
_fs.readFile(dirPath, (_err, res) => {
if (_err) {
console.error(_err);
}
let file = res.toString("utf-8");
console.log(file);
response = file;
let lines = file.split("\n");
for (let i = 0; i < lines.length; i++) {
console.log(lines[i]);
}
});
return response;
}
api.ts
export class CAPIClass extends Wrapper {
public after = after;
constructor() {
super({
configFileName: "package-name-v1.json"
});
}
}
预期输出
export class CMyAppNameClass extends Wrapper {
public after = after;
constructor() {
super({
configFileName: "package-name-v1.json"
});
}
}
如果出现错误,您只是记录错误但继续执行逻辑。因此,您似乎 运行 陷入错误,导致 res
变为 undefined
。由于现在 fs
公开了一个基于承诺的 api,我将重写如下而不是使用 callbacks
(还要注意你使用 utf-8
进行编码,但它应该是 utf8
):
async updateTsFile() {
const npmdir = `${process.cwd()}/${this.props.appName}`;
const dirPath = `${npmdir}/${"./api.ts"}`;
console.log("path", dirPath);
try {
const fileData = await _fs.promises.readFile(dirPath);
const fileAsStr = fileData.toString("utf8");
// replace class-name
fileAsStr = fileAsStr.replace(/CAPIClass/g, "CMyAppNameClass");
// (over)write file: setting 'utf8' is not actually needed as it's the default
await _fs.promises.writeFile(dirPath, fileAsStr, 'utf8');
} catch (err) {
console.log(err);
// handle error here
}
}
我正在使用 yeoman 生成器构建新项目,它正在创建所有目录和 运行 依赖项,现在一旦生成文件,我想更新 js class 与 appName 相同,
首先,我试图读取 ts 文件,但我没有这样做,它会抛出错误 TypeError: Cannot read property 'toString' of undefined
然后我会用 appName 更新文件,如果有更好的方法来完成这个任务,我会感谢帮助。
index.js
updateTsFile () {
const npmdir = `${process.cwd()}/${this.props.appName}`;
const dirPath = `${npmdir}/${"./api.ts"}`;
console.log("path", dirPath);
let response;
_fs.readFile(dirPath, (_err, res) => {
if (_err) {
console.error(_err);
}
let file = res.toString("utf-8");
console.log(file);
response = file;
let lines = file.split("\n");
for (let i = 0; i < lines.length; i++) {
console.log(lines[i]);
}
});
return response;
}
api.ts
export class CAPIClass extends Wrapper {
public after = after;
constructor() {
super({
configFileName: "package-name-v1.json"
});
}
}
预期输出
export class CMyAppNameClass extends Wrapper {
public after = after;
constructor() {
super({
configFileName: "package-name-v1.json"
});
}
}
如果出现错误,您只是记录错误但继续执行逻辑。因此,您似乎 运行 陷入错误,导致 res
变为 undefined
。由于现在 fs
公开了一个基于承诺的 api,我将重写如下而不是使用 callbacks
(还要注意你使用 utf-8
进行编码,但它应该是 utf8
):
async updateTsFile() {
const npmdir = `${process.cwd()}/${this.props.appName}`;
const dirPath = `${npmdir}/${"./api.ts"}`;
console.log("path", dirPath);
try {
const fileData = await _fs.promises.readFile(dirPath);
const fileAsStr = fileData.toString("utf8");
// replace class-name
fileAsStr = fileAsStr.replace(/CAPIClass/g, "CMyAppNameClass");
// (over)write file: setting 'utf8' is not actually needed as it's the default
await _fs.promises.writeFile(dirPath, fileAsStr, 'utf8');
} catch (err) {
console.log(err);
// handle error here
}
}