Всем привет!

Во время разработки проекта появилась необходимость все чаще использовать командную строку Unix системы. Процесс автоматизации неизбежно должен быть разработан. Кому интересно, прошу под кат.



Введение


Очередной проект требует документации. У нас в разработке присутствует пара видов документации TypeDoc & JSDoc. Конечный вариант нашей документации является директорией HTML файлов, которые сгенерированы инструментом документации. Знаете, мне как разработчику было бы здорово запускать документацию на стороннем сервере. Сторонний сервер есть ни что иное как наш старый добрый Docker контейнер. Запуск Docker контейнера является ни чем иным, как управлением Unix системой через командную строку, CLI.

С чем мы сталкиваемся на каждом шаге управления документацией проекта? Инструменты генерирования документации, CLI. Как бы ни было мало сказано, оба названных направления предоставляют огромный спектр инструментов и методологий информатики. Давайте сегодня не останавливаться на инструментах, а попробуем погрузиться в Command-line Interface.

CLI


Так что же из себя представляет CLI и при чем здесь автоматизация? CLI представляет из себя текстовый интерфейс между человеком и Unix системой, где инструкции передаются посредством команд, текстовых строк. Команда представляет из себя название команды и ее параметры. Типизация Unix команд отсутствует, но общий подход их использования регламентирован.

Итак, давайте рассмотрим процесс создания документации проекта. Наш проект состоит как из JavaScript, так и TypeScript кода. При помощи JSDoc & TypeDoc мы можем автоматизировать процесс создания кодовой документации проекта. Для генерирования документации необходимы следующие команды:

  • TypeDoc

    typedoc --out .docs/ts/html --readme ./docs/README.md ./src
  • JSDoc

    jsdoc ./ -d ./.docs/js/html -R ./docs/README.md

Автоматизация данного действия поддерживается npm-scripts.

Созданная документация является ничем иным, как набором HTML файлов. Как и сказано выше, давайте создадим наш отдельный сервер для запуска нашей документации. Для запуска сервера будем использовать стандартные инструменты: Docker, Docker Compose. Предлагаю разобрать код.

#!/usr/bin/env node

/*
 * Raman Marozau <engineer.morozov@gmail.com>, 2019-present
 */

const {
  execAction,
  stop,
  Logger,
  EMPTY_LINE,
  ANSI_FG_GREEN,
  ANSI_FG_NC,
} = require('@softeq/utils');

const { exec, execSync } = require('child_process');
const fs = require('fs');

const DOCKER_COMPOSE_FILE_PATH = `${__dirname}/../docs.docker-compose.yml`;
const DOCKER_COMPOSE_FILE_PATH_DEFAULT = `${__dirname}/../docker-compose.yml`;
const DOCKER_CONTAINER_NAME = 'docs.nginx';
const DOCKER_SERVER_PORT = 7837;

if (!fs.existsSync(DOCKER_COMPOSE_FILE_PATH)) {
  Logger.error(`${DOCKER_COMPOSE_FILE_PATH} DOES NOT exist.${EMPTY_LINE}`);
}

exec(`docker stop ${DOCKER_CONTAINER_NAME} && docker rm ${DOCKER_CONTAINER_NAME}`, execAction((_, __, err) => {
  if (err && !err.message.includes(`No such container: ${DOCKER_CONTAINER_NAME}`)) {
    Logger.error(err);
  }
  execSync(`docker-compose --file ${DOCKER_COMPOSE_FILE_PATH_DEFAULT} --file ${DOCKER_COMPOSE_FILE_PATH} up --build -d`);
  Logger.stack([[`${ANSI_FG_GREEN}%s${ANSI_FG_NC}`, `${EMPTY_LINE}Documentation server: http://localhost:${DOCKER_SERVER_PORT}${EMPTY_LINE}`]]);
}, { error: false, stderr: false }));

Docker Compose files

docker-compose.yml (Gist)



version: "3"
services:
  nginx-docs:
    image: "nginx"
    container_name: "nginx"
    volumes:
      - ./.docs/html:/usr/share/nginx/html:ro
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=127.0.0.1
      - NGINX_PORT=80
    tty: true
    command: ['nginx', '-g', 'daemon off;']

docs.docker-compose.yml (Gist)



version: "3"
services:
  nginx-docs:
    container_name: "docs.nginx"
    ports:
      - "7837:80"


Для построения начального шага автоматизации процесса создания сервера документации используются Node.js утилиты работы с CLI.

Заключение


Итак, понятно как он работает. Видна одна проблема разработки. Наши действия представляют какие-либо инструменты разработки, но CLI представляет из себя лишь текстовую информацию. Мне как разработчику было бы приятно работать не с текстовой информацией, а с переменными, объектами, классами и подобное. Также стоит заметить, что создание сервера предоставляет древовидную иерархию команд. Давайте постараемся разобраться в двух пунктах выше.
На время остановимся.

> En

Комментарии (9)


  1. Vladimir_Feschenko
    23.09.2019 18:21
    +1

    «Мне как разработчику было бы приятно работать не с текстовой информацией, а с переменными, объектами, классами и подобное.» — а можно другого разработчика?


  1. ahmpro
    23.09.2019 18:22

    Простите, но ничего не понятно. Вы просто сделали простой скрипт для сборки документации и отдачи ее в виде статики через контейнер?
    А как это можно применить кроме вашего проекта?
    В чем смысл автоматизации? Вместо одной команды у вас несколько файлов для разных инструментов, в чем профит?


    1. MorozoW Автор
      23.09.2019 18:39

      Хороший комментарий. Спасибо. Старт всегда строится на самом начальном уровне. Данный скрипт отображает возможности взаимодействия с командой строкой, написание какого-либо программного кода для работы с результатами выполнения, дальнейшие действия. Простой скрипт является ничем, но его использование раскрывает суть текста, введения.
      Смысл автоматизации — инструмент для автоматизации работы с командной строкой.


      1. lair
        23.09.2019 18:41

        инструмент для автоматизации работы с командной строкой

        Какие конкретно аспекты работы с командной строкой вы хотите автоматизировать и зачем?


        1. Vladimir_Feschenko
          23.09.2019 18:48

          Присоединяюсь!


      1. ahmpro
        23.09.2019 19:29

        Процесс автоматизации неизбежно должен быть разработан.

        Старт всегда строится на самом начальном уровне.

        Простой скрипт является ничем

        Меня не покидает ощущение, что общаюсь с ботом…
        Либо у вас безумно сложный слог для понимания…


  1. hardex
    23.09.2019 18:37

    python -m SimpleHTTPServer

    Статья в принципе полностью отражает подход к работе на галерах, подобных Softeq.

    Из недостатков стоит отметить отсутствие EmptyLineFactoryProvider


  1. vilgeforce
    23.09.2019 18:40

    А чем вам bash не угодил? Или тот же Python?


  1. Vladimir_Feschenko
    23.09.2019 18:57

    Джентельмены! Вот вам бы всё своё превосходство показать! И нихрена не понимаете, что MorozoW всё понял (откровение случилось) и стал уже своим.