Инструмент командной строки node.js (cli)

Node.js внешний интерфейс Командная строка NPM

1. Сначала разберитесь с package.json

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

{
  "name": "vue-cli",
  "version": "2.9.3",
  "description": "A simple CLI for scaffolding Vue.js projects.",
  "preferGlobal": true,
  "bin": {
    "vue": "bin/vue",
    "vue-init": "bin/vue-init",
    "vue-list": "bin/vue-list"
  },
  "repository": {
    "type": "",
    "url": ""
  },
  "keywords": [
  ],
  "author": "litongqian",
  "license": "MIT",
  "bugs": {
    "url": ""
  },
  "homepage": "",
  "scripts": {
    "test": "npm run lint && npm run e2e",
    "start": "node index.js"
  },
  "dependencies": {
    "async": "^2.4.0",
    "chalk": "^2.1.0",
  },
  "devDependencies": {
    "chai": "^4.1.2",
    "eslint": "^3.19.0",
  },
  "engines": {
    "node": ">=6.0.0"
  }
}
1. Поле скриптов

Указывает аббревиатуру командной строки npm для запуска команды скрипта, например, start указывает запускnpm run start, команда, которую нужно выполнить.

2. поле корзины

Элемент bin используется для указания местоположения исполняемого файла, соответствующего каждой внутренней команде.

"bin": {
    "vue": "bin/vue",
    "vue-init": "bin/vue-init",
    "vue-list": "bin/vue-list"
  },

Приведенный выше код указывает,vueИсполняемый файл, соответствующий команде, находится в подкаталоге bin.

3. npm link

Каталог проекта:


При самостоятельной разработке модулей, таких как модуль mymodule выше, если мы хотим использовать его в приветствии, мы можем использовать относительные путиrequire('./mymodule')Загрузите модуль.

Вы также можете использовать идентификатор модуляrequire('mymodule'),Узел для загрузки пользовательских модулей должен быть установлен наnode_modulesДля вышеупомянутых модулей решение состоит в том, чтобы сопоставить модуль с глобальнымnode_modulesкаталоге создается символическая ссылка, указывающая на локальный каталог модуля.


npm linkМожет играть эту роль, автоматически установит эту символическую ссылку.

  • Рассмотрим сценарий, в котором вы разрабатываете модульmymodule, каталогhello/mymodule, вам нужно использовать этот модуль в своем собственном проекте, сначала в каталоге модулей (hello/mymodule) бежать подnpm linkЗаказ.
hello/mymodule$ npm link


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

/usr/local/lib/node_modules/mymodule -> /Users/tongqianli/Desktop/work/hello/mymodule

В это время вы уже можете использовать глобальный каталог модулей/usr/local/lib/node_modules/mymoduleМодуль mymodule есть, но ссылки на него в проекте недостаточно

Это можно решить, добавив путь:

Операционная система будет иметьPATHПеременная среды, когда система вызывает команду, она будет искать путь, прописанный в переменной PATH.Если он есть в зарегистрированном пути, он будет вызван, в противном случае будет выдано сообщение, что команда не найдена.

-> export PATH=$PATH: # 将 /usr/bin 追加到 PATH 变量中
-> export NODE_PATH="/usr/lib/node_modules;/usr/local/lib/node_modules" #指定 NODE_PATH 变量

ЭтоNODE_PATHто естьNODEиспользуется в寻找模块所提供的路径注册环境变量. Мы можем указать переменную среды NODE_PATH, используя описанный выше метод.

Лучший путь:

Перейдите в каталог проекта и снова запуститеnpm linkкоманду и укажите имя модуля.

hello tongqianli$ npm link mymodule

Приведенная выше команда генерирует локальный модуль node_modules/mymodule, сопоставленный с глобальным модулем node_modules/mymodule, и глобальную глобальную карту с локальным модулем hello/mymodule.

/Users/tongqianli/Desktop/work/hello/node_modules/mymodule 
-> /usr/local/lib/node_modules/mymodule 
-> /Users/tongqianli/Desktop/work/hello/mymodule

Затем вы можете загрузить модуль в свой проект.

var myModule = require('myModule');

Таким образом,mymoduleЛюбые изменения могут быть напрямую отражены в проекте.

Если вашему проекту больше не нужен этот модуль, вы можете использовать его в каталоге проекта.npm unlinkКоманда для удаления символических ссылок.

hello tongqianli$ npm unlink mymodule

2. Исполняемый скрипт

Напиши простой скрипт привет

$ mkdirhello#创建一个文件夹 
$ cd hello && touch hello #创建命令文件

#!/usr/bin/env node
console.log('hello world');

1. Первая строка скрипта обычно определяет интерпретатор, то есть какой интерпретатор скрипт должен выполняться. Эта линия начинается с#!Персонаж начинается, этого персонажа зовут Шебанг, поэтому эта линия называется линией Шебанга.

#!Последний является местом расположения интерпретатора скрипта.Интерпретатор для скриптов Bash обычно/bin/shили/bin/bash.

nodeИнтерпретатор скрипта есть/usr/local/bin/node

Используйте приведенную выше командуenvкоманда (эта команда всегда/usr/binкаталог), возвращает расположение исполняемого файла Node.

#!/usr/bin/env NAMEЭтот синтаксис означает, пусть оболочка найдет$PATHПервая подходящая переменная средыNAME. Это полезно, если вы не знаете точного пути к команде или хотите быть совместимым с машинами других пользователей.

#!/usr/bin/env узел здесь означает использование узла в качестве интерпретатора скрипта.Вы можете опустить узел ./hello и запустить ./hello напрямую.Путь к узлу находится с помощью env, что позволяет избежать различных путей установка узла Не могу найти проблему.

Открыть/usr/bin/env можно посмотреть ПУТЬ, операционная система находит узел по пути



Выполнение разрешений и путей

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

# 给所有用户执行权限
$ chmod +x hello

# 给所有用户读权限和执行权限
$ chmod +rx hello
# 或者
$ chmod 755 hello

# 只给脚本拥有者读权限和执行权限
$ chmod u+rx hello

Разрешения сценария обычно устанавливаются на755(Владелец имеет все разрешения, другие имеют права на чтение и выполнение) или700(Только владелец может выполнить).


Затем измените разрешения hello.

$ chmod 755 hello
$./hello


Если вы хотите удалить путь перед приветствием, вы можете добавить путь приветствия в переменную окружения PATH. Однако еще один лучший способ — создать новый package.json в текущем каталоге и написать следующее содержимое.

{
  "name": "hello",
  "bin": {
    "hello": "./hello"
  }
}

Затем выполните команду npm link. не понимаю

$ npm link



После выполнения будет сгенерировано отношение глобального сопоставления: исполняемый скрипт bin/hello сопоставляется с глобальным node_modules/hello/hello, а глобальный node_modules/hello сопоставляется с локальным hello, так что hello можно использовать.

3. Параметры командной строки

Аргументы командной строки можно получить с помощью системной переменной process.argv.

Измените сценарий приветствия

#!/usr/bin/env node
console.log('hello ', process.argv);

где process — глобальная переменная в процессе узла, process.argv — массив, а массив хранит различные части командной строки, argv[0] — путь установки узла, argv[1] — путь к файлу основного модуля , а остальное является подкомандой или параметром, как показано ниже:


$ hello a b c
# process.argv的值为[ '/usr/local/bin/node', '/usr/local/bin/hello', 'a', 'b', 'c' ]


Сценарий может создать дочерний процесс с помощью модуля child_process для выполнения системных команд Unix и изменения приветствия.

execметод используется для выполнения команды bash,execМетод может принимать до двух параметров.Первый параметр-команда оболочки, которая должна быть выполнена, а второй параметр-функция обратного вызова.Функция принимает три параметра: возникшая ошибка, результат отображения стандартного вывода, и отображение стандартного результата ошибки.


#!/usr/bin/env node
var name = process.argv[2];
var exec = require('child_process').exec;

var child = exec('echo hello ' + name, function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);
});

执行$ hello litongqian

Если мы хотим увидеть все файлы, модифицируем hello

var name = process.argv[2];
var exec = require('child_process').exec;

var child = exec(name, function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);
});

执行$ hello ls 

hello目录下有三个文件


В-четвертых, модуль shelljs

Модуль shell.js переупаковывает child_process, чтобы упростить вызов системных команд. Его необходимо использовать после установки.

npm install --save shelljs

Затем перепишите сценарий.

#!/usr/bin/env node
var name = process.argv[2];
var shell = require("shelljs");

shell.exec("echo hello " + name);

Пять, яргс модуль

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

$ npm install --save yargs

Модуль yargs предоставляет объекты argv для чтения аргументов командной строки. Смотрите переписанный привет.

#!/usr/bin/env node
var argv = require('yargs').argv;

console.log('hello ', argv.name);

При использовании могут использоваться следующие два использования.

$ hello --name=tom
hello tom

$ hello --name tom
hello tom

То есть необработанное возвращаемое значение process.argv выглядит следующим образом.

$ node hello --name=tom
[ 'node',
  '/usr/local/bin/hell',
  '--name=tom' ]

yargs можно изменить на объект из приведенного выше результата, и каждый элемент параметра представляет собой пару ключ-значение.

6. Опубликуйте пакет команд

Публикуйте через npm publish, если у вас есть учетная запись npm. Как работать можно посмотретьофициальная документация нпм.

В этой статье используется собственный node.js для разработки командных инструментов, а vue-cli использует command.js для упрощения разработки командных инструментов.

Как только вы поймете процесс выполнения и изучите соответствующие модули, все! , Эта статья бросает кирпич


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

1. Поле bin в package.json

Элемент bin используется для указания местоположения исполняемого файла, соответствующего каждой внутренней команде.

"name":"someTool",
"bin": {
  "someTool": "./bin/someTool.js"
}

Приведенный выше код указывает, что исполняемый файл, соответствующий команде someTool, — это someTool.js в подкаталоге bin.

Когда проект зависит от вышеуказанного инструмента someTool, он одновременно устанавливается только локально.

{
  "name": "myproject",
  "devDependencies": {
    "someTool": "latest"
  },
  "scripts": {
    start: 'someTool build'  //等同于start: './node_modules/someTool/someTool.js build'

  }
}

npm будет искать этот файл вnode_modules/.bin/Создайте символическую ссылку в каталоге. В приведенном выше примере someTool.js создаст символическую ссылкуnpm_modules/.bin/someTool. из-заnode_modules/.bin/Каталог будет добавлен в системную переменную PATH во время выполнения, поэтому при запуске npm вы можете вызывать эти скрипты напрямую через команды без пути.

Таким образом, запись, подобная приведенной выше, может быть сокращена.

scripts: {  
  start: './node_modules/someTool/someTool.js build'
}

// 简写为

scripts: {  
  start: 'someTool build'
}

всеnode_modules/.bin/Команды в каталоге могут быть использованыnpm run [命令]формат для запуска. В командной строке введитеnpm run, затем нажмите клавишу табуляции, чтобы отобразить все доступные команды.

1. npm run

В приведенном выше кодеscriptsполе указывает две команды

start
,войтиnpm run-script startилиnpm run start, выполнитsomeTool build.npm runдаnpm run-scriptАббревиатура , как правило, используется в первом случае, но второе может лучше отражать суть команды.

npm runКоманда автоматически добавляет переменную среды$PATHДобавить кnode_modules/.binкаталог, так чтоscriptsНет необходимости добавлять путь при вызове команды в поле, что позволяет избежать глобальной установки модуля NPM.

npm runЕсли вы запустите его напрямую без добавления каких-либо параметров, он выведет списокpackage.jsonВсе команды исполняемого скрипта внутри.

npm имеет два встроенных сокращения команд,npm testэквивалентно выполнениюnpm run test,npm startэквивалентно выполнениюnpm run start.

npm runсоздаст оболочку, выполнит указанную команду и временноnode_modules/.binДобавление переменной PATH означает, что локальные модули могут запускаться напрямую.

Например, вы выполняете команду установки ESLint.

$ npm i eslint --save-dev

После выполнения вышеуказанной команды будут получены два результата. Во-первых, ESLint устанавливается в текущий каталогnode_modulesподкаталоги; во-вторых,node_modules/.binКаталог сгенерирует символическую ссылкуnode_modules/.bin/eslint, Исполняемые скрипты модуля Point ESLint.

Тогда ты можешьpackage.jsonизscriptВ свойствах ссылки без путейeslintэтот скрипт.

{
  "name": "Test Project",
  "devDependencies": {
    "eslint": "^1.10.3"
  },
  "scripts": {
    "lint": "eslint ."
  }
}

подождите, пока не запуститсяnpm run lint, он будет автоматически выполняться./node_modules/.bin/eslint ..

Если запустить напрямуюnpm runЕсли аргументы не указаны, они будут перечисленыscriptsВсе команды в свойствах.

$ npm run
Available scripts in the user-service package:
  lint
     jshint **.js
  test
    mocha test/

Это заканчивается здесь!