Как динамически создавать и записывать содержимое в файлах и папках с помощью nodejs при создании генератора стартового набора - PullRequest
0 голосов
/ 26 марта 2019

Я хочу создать генератор Project Starter Kit Generator для фреймворка, такого как Angular CLI, с node.js.

Ниже приведены функции, которые потребуются при условии, что команда будет kit-cli:

  • kit-cli init или kit-cli am/as: задаст несколько вопросов и на основечто он создаст все файлы и папки для начала работы.

  • kit-cli add option: создаст и добавит некоторые коды в существующие файлы и при необходимости выполнит некоторые системные команды.

У меня в голове следующий подход:

  • Размещение моего контента в файлах JSON.

  • На основепо выбору пользователя, читать содержимое из файла JSON и создавать папки и файлы.

  • Не знаю, как я буду добавлять / удалять коды из существующего файла.

Вопросы:

  • Как хранить и создавать структуру папок / файлов, предполагая, что структура папок будет варьироваться в зависимости от выбора пользователя.

  • Как мне отредактировать / добавить / удалить код из существующего файла.

1 Ответ

0 голосов
/ 26 марта 2019

Для этого вы можете использовать файловую систему узла или сценарий чистой оболочки. С узлом:

const fs = require("fs");

fs.writeFile(filePath, fileData, (err,res) => {
    if(err) console.log(err);
    console.log(res);
});

Для записи файлов в узел:

fs.readFile('./file3.json', (err,res) => {
    let file = res;
    console.log(res.toString('utf-8'));
});

Вы можете обернуть файл fs.writeFile, чтобы использовать его со всеми необходимыми файлами, например:

createFile('./file1.json', '{"pro1": "value1"', "prop2": "value2"}');
createFile('./file2.json', '{"pro3": "value3"', "prop4": "value4"}');
createFile('./file3.json', '{"pro5": "value5"', "prop6": "value6"}');

function createFile(path, data) {
    fs.writeFile(path, data, (err,res) => {
        if(err) console.log(err);
        console.log(res);
    });
}

Вот как вы можете прочитать файл js:

fs.readFile('./file.js', (err,res) => {
    let file = res.toString('utf-8');
    console.log(file);
    let lines = file.split('\n');
    for(var i = 0; i < lines.length; i++) {
        console.log(lines[i]);
    }
});

Вот как вы бы добавили к нему модули:

let modules = ['const def = require("def");', 'const xyz = require("xyz");'];

fs.readFile('./abc.js', (err,res) => {
    let file = res.toString('utf-8');
    let lines = file.split('\n');
    for(var i = 0; i < lines.length; i++) {
        if(i==0) {
            let mod = '';
            for(var j = 0; j < modules.length; j++) {
               mod += modules[j] + "\n"; 
            }
            lines[i] = mod + lines[i];
        }
    }
    let newFile = lines.join('\n');
    createFile('./abc.js', newFile);
});

Мы проверяем, находимся ли мы в первой строке файла, поэтому мы знаем, куда мы помещаем импорт модулей.

Вы можете определить все свои модули в массиве и добавить его в первую строку перед первым модулем, поэтому:

lines[i] = mod + lines[i];

Затем мы берем все строки и добавляем новую строку между ними, чтобы сохранить наш файл.

let newFile = lines.join('\n');
createFile('./abc.js', newFile);

Вот как вы можете проверить, находитесь ли вы в конце объявления метода:

if(lines[i].includes('});')) {
        lines[i] = '\tconsole.log("xyz added");\n\n' + lines[i];
}

Чтобы убедиться, что вы добавили правильный метод вместо всех:

if(lines[i].includes('});') && lines[i].includes('abc')) {
    lines[i] = '\tconsole.log("xyz added");\n\n' + lines[i];
}

И добавьте комментарий в объявлении вашего метода:

abc.method(function () { 
  console.log("abc called");
}); // end of abc
...