Как разработать свой собственный инструмент cli с помощью узла

Node.js внешний интерфейс Linux Открытый исходный код
Как разработать свой собственный инструмент cli с помощью узла

Как разработать свой собственный инструмент cli с помощью узла

вдохновение

Вдохновение и сценарий для написания этого инструмента пришли отyoutubeнебольшой разговор

сцены, которые будут использоваться

Изначально мы написали блог, чтобы показать оболочку, такую ​​как: установка и запуск докера, сценарии развертывания в один клик и другие терминальные операции.Нам нужно сделать много скриншотов, чтобы показать пользователям.Почему мы не можем сгенерировать веб страница более интуитивно и удобно?

как использовать

  • Установить
  sudo npm install share_shell -g
  • помощь
  tw --help   #1.0暂时用这个命令,没想到好的缩写

tw --help

  • Посмотреть версию
tw --version || tw -v
  • использовать
 # tw share "要展示的命令" -p "路径"
 # 例如想 docker ps -a 秀一波你的docker容器
 tw share "docker ps -a" 或 tw s "docker ps -a"  # 默认生成 share_you_shell.html 到当前目录  
 
 # 还可以指定路径
 
 tw share "ls -all" -p /usr/local/html/share_shell.html  #自动创建文件,存在默认覆盖

Как сделать свой кроссплатформенный инструмент на основе node

① Думать перед производством

  • Задействованный технологический стек и выбор технологий

  • shelljs для обработки CMD

    首先我需要拿到 *windows* 或 linux* 的系统回调,使用 *linux* 中的 
    
# 在终端获取输入任何命令的流的返回值
sed -n 'p;n;p'

Тогда сначала рассмотрим *shelljsЕдиное обнаружение API дляsedОбработки очень мало, и она не соответствует нашим потребностям, но мы видим универсальную функциюshell.exec, мы используем его обратный вызов, чтобы получить наш текст

  • fsилиfs-extra

    fs-extraдляfsотношения похожиlodashа такжеunderscoreПервый инкапсулирует второй, обеспечивает лучшую поддержку и обратно совместим.APIЭто непросто, мы в основном используем его для создания простогоhtmlфайл, чтобы поделиться нашимshell

  • commander

    мы выбралиnodejsизcommanderсделать что-то вродеgit dockerСтильcliинструменты командной строки, так как нет другого лучшего варианта

  • разное

    я сам его используюlodash stringВыполняется ленивая операция.Недостаток в том, что добавляются две зависимости.Преимущество в том, чтоспешите~

② Подготовка перед написанием кода

  • инициализация

    npm initИнициализация генерирует стандартpackage.jsonфайл, включая вашgitИнформационный релизnpmМожно найти ваше описание, контактную информацию, номер версии и т.д.

  • Создайте новую папку bin

    Это дом канонического исполняемого инструмента. создать новыйtw.js, потому что это стиль принтера, поэтому у него есть слепое имяtypeWriterИнициалы

③ Сначала определите основные команды терминала

  • редактироватьtw.js

    var program = require('commander');
    
    var appInfo = require('../package.json');
    
    program.version(appInfo.version) // 拿到 package.json 你定义的版本
    program
        .command('share <shell>') // 定义你的command
    
        .alias('s') // 缩写
    
        .description('Enter the "shell" you want to convert and include it in \" \"  ') // 描述
    
        .option("-p, --path <path>", "Enter you html path , default ./share_you_shell.html") // option 字命令,可以无限多个
    
        .action(function (cmd, options) {
        // 拿到cli输入的option子命令,没有可以默认
            var path = typeof options.path == 'string' ? options.path : "./share_you_shell.html"
            // 执行你的操作 ↓
            // 执行cli的command
            exec_shell.exec(cmd, (res) => {
                // 回调的res根据格式转为数组
                var res_arr = S(res).lines()
                // 针对数组你的逻辑处理一波数组
                let str = format.toTypedFormat([cmd].concat(res_arr))
                // 异步制作你的文件,传入路径
                file.mkfile(str, path)
            })
        }).on('--help', function () {
    
             // --help  commander 有默认处理,一般这部分无事可做,你还想干啥?
        });
    
    program.parse(process.argv);
    
    

войтиtw -- helpнаверное так

tw --help

  • Улучшить код

    Улучшите логику своих юнитов, конечно, вы также можете написать более элегантно.

  • Предупрежденные вопросы

    Я этот проект буду заранее думать: сохранитьПереводчики для оболочкииспользоватьpreВвод прототипа\n \t, справитьсяscrollДержитесь внизу и, наконец, найдите случайный, напримерtypewriterjsБиблиотека с открытым исходным кодом, просто сгенерируйте фрагменты кода в соответствии с его стилем

④ Проверьте это

  • законченный?

    node /bin/tw.js share "tree -L 2" -p xxxПротестируйте его (возможно, он у вас не установлен)tree, для любой другой исполняемой команды, длиннойpingКроме)

  • Пройти глобальный тест

    Наконец-то мы опубликуемnpmВключено, позволяя пользователям-gУстановите, вы должны проверить это в первую очередь.

    Первое: убедитесь, что вы находитесь вpackage.jsonфайл добавленbinузел. И указать основную программу, как я.

        "bin": {
            "tw": "./bin/tw.js"
          },
    
  • бегать

    sudo npm install . -g
    
  • воплощать в жизнь

    tw share "tree -L 2" -p xxx/xxx/xx.html
    

    если генерируетсяxx.html, поздравляю, вы готовы к публикации

④Как опубликоватьnpm

  • Проект готов, и следующий шаг — начать публикацию. Сначала зарегистрируйте аккаунт на npm, и не забудьте зайти на почту для проверки. Затем введите:

    npm adduser
    

Далее вы узнаете свой логин, пароль и публичный адрес электронной почты в виде вопроса и ответа, а затем войдете

```
npm publish
```
  • Уведомление! ! выпускатьnpmИсточник не будьcnpmИсточник Taobao, иначе ответ401ой

Затем вы увидите индикатор выполнения, а затем компонент будет успешно выпущен, вы можете перейти кnpmНайдите свой собственный пакет.

npm install share_shell

(зависит от тебяpackage.jsonНазвание проекта заполнено на тот момент)

даже ты казнишь

cnpm install share_shell

Его также можно скачать, Taobao очень быстро синхронизируется~

  • npm i share_shell -gМировойвсеПользователи могут скачать

⑤ Мысли, которые вызывают

  • думать

nodeТеперь, когда он предоставляет нам такой краткий способ, мы можем сделать что-то более значимое, например, создать для нашего проекта с открытым исходным кодомразвертывать,выпускать,Пакет,тестовое задание,CLIНабор инструментов, который может выполнять повседневную работупакетная обработка, такой как сценарий в предыдущей работе: несколько серверовБалансировка нагрузкиПросмотр бэкенд-лога - проблема, нужно открывать много терминалов, можно ли настроить?rsaилиsshКак насчет объединения нескольких конвейеров и перенаправления их на терминал для просмотра? Когда у нас есть идея, мы можем воплотить ее в жизнь

Наконец-то покажу новую игрушку.

обо мне

Чжуан Венда: Полная разработка Siege Lion

  • Мне просто нравится учиться, и я хочу стимулировать всех учиться вместе🤓
  • Нет ничего лучше, чем строить колеса 🤓
  • ведение блога 🤓
  • Запись обмена видео 🤓
  • Попрактикуйтесь в технике 🤓
  • Встаньтеflag, но вернусь 🤓
  • сейчас пишуbbs🤓

Наконец-то покажу новую игрушку.

увидимся в следующем выпуске