С легкостью создавайте файловые деревья для ваших README

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

В этой статье мы рассмотрим, как создать скрипт, генерирующий дерево файлов для README вашего проекта. Мы также расскажем, как исключить файлы и папки из дерева файлов и как связать сценарий с командой, чтобы вы могли легко создать дерево файлов из любого каталога.

Создание скрипта

Мы будем использовать Node.js для создания нашего скрипта. Вот код:

const fs = require('fs');
const path = require('path');

const outputFileName = 'directory_structure.md';

const excludedItems = [
  '.DS_Store',
  '.git',
  'node_modules',
  '.vscode',
  '.idea',
  '__pycache__',
  '.gitignore',
  '.npmignore',
  '.eslintignore',
];

function getDirectoryStructure(dir, level = 0, parentIsLast = []) {
  let structure = '';

  const files = fs.readdirSync(dir).filter((file) => !excludedItems.includes(file));
  files.forEach((file, index) => {
    const fullPath = path.join(dir, file);
    const stats = fs.statSync(fullPath);
    const isLastItem = index === files.length - 1;

    const prefix = parentIsLast.map((isLast) => (isLast ? '    ' : '│   ')).join('');
    const line = isLastItem ? '└── ' : '├── ';

    if (stats.isDirectory()) {
      structure += `${prefix}${line}${file}\n`;
      structure += getDirectoryStructure(fullPath, level + 1, [...parentIsLast, isLastItem]);
    } else {
      structure += `${prefix}${line}${file}\n`;
    }
  });

  return structure;
}

function writeDirectoryStructureToFile() {
  const currentDir = process.cwd();
  const structure = getDirectoryStructure(currentDir);
  fs.writeFileSync(outputFileName, "```\n" + structure + "```\n");
  console.log(`Directory structure written to ${outputFileName}`);
}

writeDirectoryStructureToFile();

Давайте разберемся, что происходит

Во-первых, нам нужны модули fs и path. Мы будем использовать эти модули для чтения файловой системы и управления путями к файлам.

Затем мы определяем две переменные: outputFileName и excludedItems.

outputFileName — это имя файла, в который мы будем записывать дерево файлов. В данном случае мы используем directory_structure.md.

excludedItems — это массив имен файлов и папок, которые мы хотим исключить из дерева файлов. В этом случае мы исключаем общие файлы и папки, которые не хотим включать в дерево файлов.

Далее мы определяем функцию с именем getDirectoryStructure. Эта функция принимает путь к каталогу, уровень (который мы будем использовать для определения уровня отступа) и массив с именем parentIsLast, который мы будем использовать, чтобы определить, является ли папка последним элементом в своей родительской папке.

Внутри функции мы сначала инициализируем пустую строку с именем structure.

Затем мы используем модуль fs для чтения содержимого каталога и фильтрации любых файлов или папок, которые находятся в массиве excludedItems.

Затем мы просматриваем каждый файл или папку и получаем их полный путь и статистику (используя fs.statSync).

Мы определяем, является ли элемент последним в своей родительской папке, проверяя его индекс в массиве files.

Затем мы используем массив parentIsLast, чтобы определить соответствующий уровень отступа, и переменную `isLastItem`, чтобы определить, должны ли мы использовать строку └── или ├──.

Если элемент является папкой, мы рекурсивно вызываем функцию getDirectoryStructure и добавляем ее содержимое в строку structure.

Наконец, мы возвращаем строку structure.

Затем мы определяем функцию с именем writeDirectoryStructureToFile. Эта функция получает текущий рабочий каталог, используя process.cwd(), и вызывает getDirectoryStructure с этим каталогом.

Затем мы записываем полученную строку structure в файл outputFileName, используя fs.writeFileSync.

Наконец, мы записываем в консоль сообщение о том, что дерево файлов было записано в файл.

Исключение файлов и папок

Вы можете исключить определенные файлы или папки из дерева файлов. Для этого просто добавьте имя файла или папки в массив excludedItems.

Например, если вы хотите исключить папку с именем logs, вы должны добавить “logs” к массиву excludedItems следующим образом:

const excludedItems = [
  '.DS_Store',
  '.git',
  'node_modules',
  '.vscode',
  '.idea',
  '__pycache__',
  '.gitignore',
  '.npmignore',
  '.eslintignore',
  'logs', // Add your excluded file or folder here
];

Привязать скрипт к глобальной команде

Время для веселой части! Чтобы сделать этот скрипт более удобным в использовании, мы можем привязать его к глобальной команде, которую можно запускать из любого каталога. Для этого выполните следующие действия:

  1. Сохраните сценарий из предыдущего раздела в файл с именем generate_file_tree.js. Вы можете сохранить этот файл в удобном месте, например, в домашнем каталоге или в папке скриптов.
  2. Откройте терминал (или командную строку в Windows) и перейдите в каталог, в котором вы сохранили файл generate_file_tree.js.
  3. Выполните следующую команду, чтобы сделать скрипт исполняемым:
chmod +x generate_file_tree.js

Примечание. Этот шаг не требуется в Windows.

4. Создайте символическую ссылку на сценарий в каталоге вашей системы PATH. Например, вы можете использовать /usr/local/bin в macOS и Linux или C:\Windows\System32 в Windows.

В macOS и Linux выполните следующую команду:

   sudo ln -s "$(pwd)/generate_file_tree.js" /usr/local/bin/generate-file-tree

В Windows выполните следующую команду в командной строке администратора:

   mklink "C:\Windows\System32\generate-file-tree.js" "Full\Path\To\generate_file_tree.js"

Замените Full\Path\To фактическим путем к файлу generate_file_tree.js.

5. Теперь вы можете использовать команду generate-file-tree из любого каталога, чтобы сгенерировать дерево файлов для этого каталога. Дерево файлов будет сохранено в файл с именем directory_structure.md в текущем каталоге.

Чтобы запустить команду, просто введите generate-file-tree в терминале (или в командной строке Windows) и нажмите Enter.

   generate-file-tree

Консоль отобразит сообщение о том, что структура каталогов была записана в файл `directory_structure.md`.

Вот и все! Теперь у вас есть глобальная команда, которую вы можете запустить из любого каталога, чтобы сгенерировать дерево файлов для README вашего проекта. Не забудьте обновить массив excludedItems в скрипте, если вам нужно исключить дополнительные файлы или папки.

Если вы нашли эту статью полезной или интересной, подпишитесь на меня! Мне нравится учиться публично и делиться своими выводами несколько раз в неделю.