2015-04-07 1 views
0

Я строю модуль узла cli. Я хотел бы, чтобы люди могли использовать его и использовать его сразу с помощью команды npm my-project --arg=foo. Он предназначен для использования локального проекта CLI в качестве инструмента dev, а не для глобальной установки.Локально установленный проект NPM NPC, который легко выполнить

Похоже, что стандарт должен использовать bin в package.json, но я не понимаю кое-что о нем:

  1. Когда я должен использовать bin и когда я должен использовать scripts?
  2. Как запустить команду в проекте включения? npm my-project не делает.

Вот что я делаю сейчас в package.json:

{ 
    "name": "my-project", 
    "bin": "./cli.js" 
} 

И я могу запустить его локально:

node cli.js --arg=foo 

Но когда я npm-install my-project где-то еще, я не знаю, как для запуска скрипта, который он помещает в bin (npm run my-project не работает), или если я использую это правильно.

+0

После многого обучения и помощи от @robertklep, я обнаружил, что нет способа создать модуль для локальной установки, который имеет короткий исполняемый путь. Вы должны использовать './Node_modules/.bin/my-project'. Фундаментальное недоразумение. Вот почему, например, существует «grunt-cli». – SimplGy

ответ

2

Давайте начнем с объяснения разницы между 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.

+0

Единственный способ проверить это - версия изменений, git tag, publish, npm install в зависимости от проекта. Есть ли более простой способ проверить способ создания символической ссылки? 'npm link' для глобального материала, а' npm unlink' не является симметричным для локальных пакетов (вроде ошибки, я думаю, но я не вникнул в нее) – SimplGy

+0

@SimplGy см. мое редактирование в отношении свойства 'bin'. Что касается связывания: 'npm unlink' действительно не удалит символическую ссылку, которая раздражает. В качестве альтернативы для использования 'npm link' вы можете установить правильные разрешения для скрипта в каталоге пакета и дать ему shebang (что ему нужно в любом случае), поэтому вы можете вызвать его напрямую:' $ ./cli.js ' – robertklep

+0

Установить разрешения, иметь shebang. Работает внутри проекта. Подумайте, что существует проблема, связанная с тем, что это локальная установка, а не глобальная. Я выполнил весь цикл «change change publish npm install», и зависящий проект теперь добавляет «node_modules/bin/my-project» как символическую ссылку, но это не в любой $ PATH, который я могу найти. Я перезапустил терминал, но я думаю, что, возможно, локальная установка не помещается в $ PATH? – SimplGy

Смежные вопросы