Весь процесс разработки Node-игрушки для командной строки -- Gaoyan Statistical Tool

Node.js внешний интерфейс

задний план

Инструменты командной строки нам хорошо знакомы, а некоторые операции командной строки значительно упрощают нашу повседневную работу. Эта статья основана на счетчике кода командной строки Node, который я написал.

Я считаю, что те, кто знаком с системой linux, должны полюбить использовать некоторые команды, такие как ps, grep, cp, mv и т. д. Это также мое первоначальное намерение разработать удобную командную строку, а второе — записать всю процесс полной маленькой игрушки с открытым исходным кодом.

Возможности командной строки:

  • Простота в эксплуатации
  • Сильная видимость

Я взглянул на некоторые из текущих командных строк и столкнулся со следующими проблемами.

Поэтому родился этот ценный и удобный статистический инструмент.

Высокий цвет

исходный код игрушки

GitHub.com/flower1995116/…

Подготовить

сторонняя библиотека

  • cli-table
  • colors
  • commander
  • ignore

библиотека разработки (для тестирования)

  • chai
  • mocha
  • codecov
  • istanbu

Совместимость узлов

  • babel

статические файлы

  • Библиотека сопоставления языков
  • библиотека цветов

идеи

Получить пользовательскую конфигурацию пользователя через командующий

program
    .version('0.1.0')
    .option('-i, --ignore [dir]', 'ignore dir')
    .option('-p, --path [dir]', 'ignore dir')
    .parse(process.argv);

Узел обхода файла, информация о количестве строк на каждом языке

function getFile(dirPath) {

    const files = fs.readdirSync(dirPath);

    files.forEach((item) => {
        ...
    })
}
                  

игнорировать вывод фильтра в кеш

function handleIgnode(cPath) {
    try {
        const currentPath = path.join(ROOTPATH, '.gitignore');
        const fileData = fs.readFileSync(currentPath, 'utf-8');
        const ignoreList = fileData.split('\n');
        const filterList = filterData(ignoreList);
        const ig = ignore().add(filterList);
        return ig.ignores(cPath);
    } catch (e) {
        return false;
    }
}

Пройдите кеш, подсчитайте максимальную строку и выполните цвета

function hanldeTable(){
    ...
    if (maxCount < langInfo[item].totalLines) {
        maxCount = langInfo[item].totalLines;
        maxIndex = index;
    }
    ...
}

отображение вывода cli-таблицы

function outputTbale() {
    const {
        header,
        content,
        bottom
    } = initTable();

    const {
        totalFiles,
        totalCode,
        totalBlank,
        tablesContent
    } = hanldeTable();

	...

    console.log(`T=${totalTime} s`, `(${fileSpeed} files/s`, `${lineSpeed} lines/s)`)
    console.log(header.toString())
    console.log(content.toString())
    console.log(bottom.toString())
}

Улучшать

loading

Для многофайловых каталогов предусмотреть загрузку

lass StreamLoad {
    constructor(option) {
        this.stream = option.stream;
        this.text = option.text;
        this.clearLine = 0;
    }
    setValue(value) {
        this.text = value;
        this.render();
    }
    render() {
        this.clear();
        this.clearLine++;
        this.stream.write(`read ${this.text} file\n`);
    }
    clear() {
        if(!this.stream.isTTY) {
            return this;
        }
        
        for (let i = 0; i < this.clearLine; i++) {
            this.stream.moveCursor(0, -1);
            this.stream.clearLine();
			this.stream.cursorTo(0);
        }
        this.clearLine = 0;
    }
}

const progress = new StreamLoad({
    stream: process.stderr,
    text: 0
})

Создал класс, реализующий загрузку. В основном используется в методе обработки в readline, см. подробностиузел будет .org/day3/latest…

babel

Совместимость с более ранними версиями узла

cnpm i babel-cli

package.json

"build": "./node_modules/.bin/babel src --out-dir lib"

прецедент

Демонтировать

Используется для проверки правильности обхода файла.

const path = require('path');
const assert = require('chai').assert;

const {getFileData} = require('../src/linec');

describe('linec files test', () => {
    it('can linec dir', () => {
        const url = path.join(__dirname, '../example');
        console.log(url);

        const dirObj = JSON.stringify(getFileData(url));

        const expectData = '{"CSS":{"file":1,"blankLines":0,"totalLines":4,"color":"#563d7c"},"JavaScript":{"file":1,"blankLines":0,"totalLines":1,"color":"#f1e05a"},"JSON":{"file":1,"blankLines":0,"totalLines":3,"color":"#fff"},"Markdown":{"file":1,"blankLines":0,"totalLines":1,"color":"#fff"}}';

        assert.equal(dirObj, expectData);

    })
})

бегать

./node_modules/mocha/bin/mocha

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

"test": "./node_modules/.bin/istanbul cover node_modules/mocha/bin/_mocha && ./node_modules/.bin/codecov",

выпускать

Step1

Открытьwww.npmjs.com/signup

зарегистрировать аккаунт

step2

Если у вас есть учетная запись, перейдите непосредственно к этому шагу

npm login

step3

Введите версию в package.json

{
  "name": "linec",
  "version": "1.2.4",
  "description": "line count",
  "main": "index.js",
  ...
}

step4

npm publish

Совет: обратите внимание, что вам нужно изменить версию в package.json для каждого выпуска, иначе выпуск не будет выполнен.

Командная строка

package.json

"bin": {
	"linec": "./lib/index.js"
},

локальная командная строка проекта

npm link

Вы можете использовать команду linec для мягкого подключения команды linec к локальной сети, а имя linec можно настроить.

удаленная командная строка

По умолчанию используется имя пакета, но если имя определено в bin, как указано выше, имя можно изменить. То есть имя пакета может не совпадать с командой, но для более удобного использования рекомендуется унифицировать имя пакета и команду.

Для получения подробной информации см.Уууу. Руан Ифэн.com/blog/2015/0…

Непрерывное интеграционное тестирование и автоматическое покрытие покрытия

travis-ci.org/

настроить.travis.yml

language: node_js

node_js:
  - "stable"

sudo: false

before_script:
  - npm install

Это моя конфигурация.Каждый раз, когда вы отправляете, если он содержит команду npm run test, travis автоматически вызывает и обнаруживает ее автоматически.

Преимущество Travis также в том, что он автоматически запускает тестовые примеры, когда кто-то отправляет вам pr, избегая некоторых низкоуровневых ошибок. Ниже приведена диаграмма эффектов.

codecov.io/gh

Это инструмент для статистического покрытия кода, добавьте его в npm run test и вы сможете увидеть статистику покрытия в pr

Установить и использовать

$ npm install -g linec / cnpm install -g linec 

Основное использование

$ linec

экспортировать в html

$ linec -o

После запуска в текущем каталоге появится файл output.html.

Функция

  • Вывод пустых строк, фактических строк, общих строк
  • Поддерживается более 400 языков
  • Показать скорость перемещения
  • Отображение нескольких цветов
  • Поддержка экспорта html

Исходный код инструмента (приветствуется пометкой)GitHub.com/flower1995116/…

визуализация

Основной режим

Открыть после экспорта HTML

конец

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