Давайте начнем с объяснения разницы между bin
и scripts
: бывший вы используете, если вы хотите, чтобы предоставить инструмент командной строки, последний используется, если вы хотите, чтобы предоставить дополнительную команду npm
(с некоторыми оговорками, хотя, см ниже).
В вашей ситуации, я думаю, вы хотите использовать bin
. Однако вместо пользователя, использующего npm my-project --arg=foo
, они будут использовать my-project --arg=foo
, при условии, что ваш скрипт называется my-project
. Чтобы это произошло, ваш package.json
будет содержать что-то вроде этого:
"bin" : "./bin/my-project"
Во время установки, это будет копировать ./bin/my-project
в «БИН» директории (обычно /usr/local/bin
на Unix-подобных OS'es). Во время разработки вы можете назвать его node bin/my-project
или даже просто ./bin/my-project
при условии, что он имеет правильные разрешения и "shebang".
EDIT: так что я забыл, что npm
будет использовать имя пакета, а не имя файла в ./bin
, как имя исполняемого файла (если bin
это строка). Если ваш пакет называется my-project
, и вы устанавливаете пакет (вам нужно использовать флаг -g
до того, как npm установит исполняемый файл), он создаст исполняемый файл с именем my-project
, независимо от того, на что указывает свойство bin
.
Другими словами:
package.json:
"name" : "my-project"
"bin" : "./cli.js"
npm install -g:
copies ./cli.js to /usr/local/bin/my-project and sets executable permissions
END EDIT
FWIW, хранения инструментов CLI в ./bin
это соглашение, но не является обязательным.
Директива scripts
полезна для более внутренних целей.Например, вы можете использовать его для запуска набора тестовых наборов или линтов или сценариев установки до/после установки.
Наконец, существуют различные модули, доступные для синтаксического анализа командной строки. Мне нравится docopt
, но другие часто используемые модули: commander
или nomnom
. Вы уже упоминали yargs
.
После многого обучения и помощи от @robertklep, я обнаружил, что нет способа создать модуль для локальной установки, который имеет короткий исполняемый путь. Вы должны использовать './Node_modules/.bin/my-project'. Фундаментальное недоразумение. Вот почему, например, существует «grunt-cli». – SimplGy