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. Исполняемый скрипт
Напиши простой скрипт привет
$ mkdir
hello
#创建一个文件夹
$
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
поле указывает две команды
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/