Используйте ShellJS для повышения эффективности разработки (1)

Shell

Shelljs - Unix shell commands for Node.js

Shelljs — это синтаксический анализатор языка сценариев в Node.js с богатыми и мощными базовыми разрешениями для операций (Windows/Linux/OS X). Shelljs — это, по сути, подключаемый модуль инкапсуляции команд на уровне уровня, основанный на узле, так что разработчики внешнего интерфейса могут напрямую писать команды оболочки в наиболее знакомом коде javascript для достижения функций, не полагаясь на Linux или инструмент преобразования, подобный cmder.

  • Решать проблему

    Сценарии оболочки знакомы во внешнем интерфейсе, и каждый использовал их в конфигурации package.json для"build": "umi build && node zip.config.js"Например, npm run build сначала выполнит сборку umi, а затем запустит скрипт zip.config.js.Что делает скрипт zip.config.js, так это то, что если папки сборки нет, папка сборки будет сгенерирована и сжата и упакован с помощью easyzip. В противном случае, если папка сборки существует, создайте zip-архив или другие файлы, необходимые компании.
    То, что делает shelljs, — это автоматизация, избавляющая от трудоемких повторяющихся рутинных действий, повышающая эффективность разработки и рабочее настроение.

  • базовая грамматика

    //引入shelljs
    var shell = require('shelljs')
    
    //检查控制台是否以运行`git `开头的命令
    if (!shell.which('git')) {
      //在控制台输出内容
      shell.echo('Sorry, this script requires git');
      shell.exit(1);
    }
    
    shell.rm('-rf','out/Release');//强制递归删除`out/Release目录`
    shell.cp('-R','stuff/','out/Release');//将`stuff/`中所有内容拷贝至`out/Release`目录
    
    shell.cd('lib');//进入`lib`目录
    //找出所有的扩展名为js的文件,并遍历进行操作
    shell.ls('*.js').forEach(function (file) {
      /* 这是第一个难点:sed流编辑器,建议专题学习,-i表示直接作用源文件 */
      //将build_version字段替换为'v0.1.2'
      shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
      //将包含`REMOVE_THIS_LINE`字符串的行删除
      shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
      //将包含`REPLACE_LINE_WITH_MACRO`字符串的行替换为`macro.js`中的内容
      shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
    });
    
    //返回上一级目录
    shell.cd('..');
    
    //run external tool synchronously
    //即同步运行外部工具
    if (shell.exec('git commit -am "Auto-commit"').code !== 0){
        shell.echo('Error: Git commit failed');
        shell.exit(1);
    }
    
  • Пример объяснения

    • shell.which(command)

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

    • echo

      Вывести указанный контент в консоль
      .to(index.txt) записать в файл

    • exit(code)
      Выйти из текущего процесса с кодом выхода в виде кода

    • rm([опции, ]файл[ файл...])

      Удаляет один или несколько файлов или каталогов в каталоге. После удаления его невозможно восстановить.

      Общие параметры:

      1. -f: Принудительно удалить файл;
      2. -i: спросить пользователя перед удалением;
      3. -r: рекурсивно обрабатывать каталоги;
      4. -v: показать процесс обработки;
      shell.rm('-rf', staticSplash);
      
    • cp([options,] source_array, dest) cp('-R','index.txt', '~/newCopy/') cp('-R',['index.txt', 'old.txt'], '~/newCopy/')

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

      Общие параметры:

      1. -f:force (default behavior)
      2. -L: follow symlinks
      3. -r,-R: recursive
      4. -n: no-clobber
      5. -u: only copy if source is newer than dest
      6. -P: don't follow symlinks
    • cd

      Переключить рабочий каталог на указанный относительный или абсолютный путь. cd.. Чтобы вернуться на предыдущий уровень, cd- возвращает в предыдущий каталог.

    • ls

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

      Общие параметры:

      1. -a: показать все файлы;
      2. -C: отображать результаты запроса в нескольких столбцах;
      3. -l: отображать результаты запроса в длинном формате с одним столбцом (в отличие от -C);
      4. -R: процессы каталогов рекурсивно;
      5. -A: Все файлы (включая файлы, начинающиеся с ., кроме . и ..)
      6. -d: указать сам каталог, а не его содержимое
      ls(path.join('bundle', 'css/')).forEach(cssName => {
        ***
      })
      
    • sed([options,] search_regex, replacement, file_array

      Замените содержимое в file_array, соответствующее search_regex, заменой, которая поддерживает обычную самоссылку группы захвата. Обрабатывайте одну строку за раз, отправляйте содержимое буфера на экран после обработки, затем обрабатывайте следующую строку и повторяйте цикл до конца.

      Общие параметры:

      1. -i: прямой исходный файл
    • cat([options,] file [, file ...])

      Чтение содержимого одного или нескольких файлов.Если указан один файл, считывается файл, а если указано несколько файлов, содержимое объединяется и считывается.

      Доступные Варианты:
      -n: number all output lines

    • exec(command [, options] [, callback])

      Выполнить пришедшую команду

      1. async: выполнять ли асинхронно, по умолчанию установлено значение false, оно будет автоматически включено при передаче обратного вызова в
      2. молчание: не выводить информацию на консоль, по умолчанию false
      3. кодировка: по умолчанию utf8
        ex
        Если не указано иное, команда выполняет данные данные синхронно. в синхронизации режиме он возвращает ShellString (совместимый с ShellJS v0.6.x, возвращает объект вида {code:..., stdout:..., stderr:...}). В противном случае это вернет дочерний процесс объект, а обратный вызов получает параметры (code, stdout, stderr).
        Примечание. Для долгоживущих процессов лучше всего запускать exec() асинхронно.
    • chmod

      Установить права доступа к файлам

      1. -c: выводить диагностику для каждого обработанного файла
      2. -v: like verbose, but report only when a change is made
      3. -R: change files and directories recursively

      u означает владельца файла, g означает ту же группу, o означает другую, a означает все
      + означает увеличение полномочий, - означает отмену полномочий, = означает только установку полномочий
      r означает доступный для чтения, w означает доступный для записи, x означает исполняемый файл, X означает, что файл является подкаталогом

      chmod(755, '/Users/brandon');
      chmod('755', '/Users/brandon'); // same as above
      chmod('u+x', '/Users/brandon');
      chmod('-R', 'a-w', '/Users/brandon');
      
    • pushd([options,][dir|'-N'|'+N'])

      Доступные Варианты
      -n: подавлять обычные изменения каталогов при добавлении каталогов в стек, чтобы манипулировать только стеком

      параметр

      1. dir: сделать текущий рабочий каталог вершиной стека, затем сделать эквивалент cd dir
      2. +N: переместите N-й каталог (слева в списке, напечатанном каталогами, начиная с нуля) в начало списка, вращая стек.
      3. -N: переместить N-й каталог (справа от списка, напечатанного каталогами, считая с нуля) в начало списка, вращая стек.
      echo(process.cwd());  // 当前文件父路径 /Users...
      pushd('/etc') // /private/etc /Users...
      pushd('+1') // users... /private/etc  
      

      Сохраните текущий каталог в верхней части стека каталогов, затем перейдите в каталог cd. Без аргументов pushd меняет местами первые два каталога. Возвращает массив путей в стеке.

    • popd([опции,]['-N'|'+N'])

      Доступные Варианты:
      -n: подавлять обычные изменения каталогов при удалении каталогов из стека, чтобы можно было манипулировать только стеком.

      параметр:

      1. +N: удалить N-й каталог (считается слева от списка, напечатанного каталогами), начиная с нуля
      2. -N: Удалить N-й каталог (считая справа от списка, напечатанного каталогами), начиная с нуля.
      echo(process.cwd()); // '/usr'
      pushd('/etc');       // '/etc /usr'
      echo(process.cwd()); // '/etc'
      popd();              // '/usr'
      echo(process.cwd()); // '/usr'
      

      Если аргументы не указаны, popd удалит каталог верхнего уровня из стека и выполнит cd в новый каталог верхнего уровня. Элементы нумеруются с 0, начиная с первого каталога, указанного в dirs, то есть popd эквивалентен popd+0. Возвращает массив путей в стеке

    • dirs([options|'+N'|'-N']

      Доступные Варианты:
      -c: очистить стек каталогов, удалив все элементы

      параметр:

      1. +N: Отобразить N-й каталог (считая слева в списке, напечатанном каталогами при вызове без параметров), начиная с нуля
      2. -N: отображать N-й каталог (считая справа от списка, напечатанного каталогами при вызове без параметров), начиная с нуля

      Отображает список запомненных в настоящее время каталогов. Возвращает массив путей в стеке или один путь, если указано +N или -N.

    • найти(путь[ путь...])

      найти файлы

      console.log(find('../Config/application.js'))
      

      вернуть путь_массив

    • grep([options,]regex_filter,file[file...])

      В отличие от fing для поиска файлов, grep используется для поиска содержимого.

      Доступные Варианты:

      1. -v: инвертировать значение регулярного выражения и вывести строки, не соответствующие условию
      2. -l: печатать только имена соответствующих файлов
      grep('-v', 'GLOBAL_VARIABLE', '*.js');
      grep('GLOBAL_VARIABLE', '*.js');
      

      Считывает входную строку из заданного файла и возвращает строку, содержащую Все строки файлов, соответствующие данному файлу regex_filter

    • глава([{'-n':},]файл[файл...])

      Прочитать начало файла

      Доступные Варианты:
      -n : отобразить первую строку файла

      console.log(head('bundle.js'))  
      console.log(head({'-n':1},'bundle.js'))  // 获取第一行
      
    • хвост([{'-n':},]файл[файл...])

      прочитать конец файла

      Доступные Варианты: -n : показать последние несколько строк файла

      var str = tail({'-n': 1}, 'file*.txt');
      var str = tail('file1', 'file2');
      var str = tail(['file1', 'file2']); // same as above
      
    • ln([options,]источник,назначение)

      Создать ссылку

      ln('file', 'newlink');  // /Users.../newlink
      ln('-sf', 'file', 'newlink');  //如果newlink存在,则强制链接🔗
      
    • mkdir([опции,]каталог[каталог...])

      Создать папку

      Доступные Варианты:
      -p: полный путь (при необходимости будет создан промежуточный каталог)

      shell.mkdir('bundle')
      shell.mkdir('-p', ['bundle', 'js'])
      
    • touch([параметры, ]файл[ файл...])

      В отличие от mkdir, который создает папки, touch создает файлы.

      Доступные Варианты:

      1. -a: изменить только время доступа
      2. -c: не создавать никаких файлов
      3. -m: изменить только время модификации
      4. -d ДАТА: указать время
      5. -r ФАЙЛ: заменить время нового файла на время ФАЙЛА
    • mv([options,]источник[источник...],назначение')

      переехать

      Доступные Варианты:

      1. -f:force (поведение по умолчанию)
      2. -n: не затирать
      mv('move', 'target');  // 将move文件移动到target文件夹
      
    • pwd()

      Просмотр текущего каталога

    • установить (варианты)

      Установить глобальные переменные конфигурации

      Доступные Варианты:

      1. +/-e: выход при ошибке (config.fatal)
      2. +/-v:verbose:показать все команды(config.verbose)
      3. +/-f: отключить расширение имени файла (подстановку)
      set('-e'); // exit upon first error
      set('+e'); // this undoes a "set('-e')"
      
    • sort([параметры, ]файл[ файл...])

      Сортировка контента

      Доступные Варианты:

      1. -r: инвертировать результат сравнения
      2. -n: сравнить по значению
      sort('foo.txt', 'bar.txt');
      sort('-r', 'foo.txt');
      

      Возвращает содержимое файла, отсортированное построчно. сортировать несколько

    • тестовое задание()

      определение типа файла

      Доступные Варианты:
      '-b', 'путь': true, если путь является блочным устройством
      '-c', 'путь': true, если путь является символьным устройством
      '-d', 'путь': верно, если путь является каталогом
      '-e', 'путь': true, если путь существует
      '-f', 'путь': верно, если путь является обычным файлом
      '-L', 'путь': верно, если путь является символической ссылкой
      '-p', 'путь': true, если путь является каналом (FIFO)
      '-S', 'путь': true, если путь является сокетом

      if (!test('-f', path)) continue;
      
    • uniq([опции,][вход,[выход]])

      Доступные Варианты:

      1. -i: игнорировать регистр при сравнении
      2. -c: сортировать префиксы по количеству вхождений
      3. -d: печатать только повторяющиеся строки, по одной на каждую строку
    • ShellString()

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

      ShellString('hello world')
      
    • ShellString.Prototype.to()

      Вывести shellString в указанный файл, что эквивалентно > на языке сценариев

    • ShellString.Prototype.toEnd()

      Добавить shellString к указанному файлу, что эквивалентно >> на языке сценариев

    • env['VAR_NAME']

      указывает на process.env

    • Поддержка цепочек вызовов Pipes

      sed, grep, cat, exec, to, toEnd все поддерживают связанные вызовы

    • Configuration

      1. config.silent sh.config.silent
      2. config.fatal config.fatal
      3. config.verbose config.verbose
      4. config.globOptions config.globOptions
      5. config.reset() сбрасывает глобальныйshell.config.reset()
Ссылка на ссылку

документация на официальном сайте shelljs