#node.js #npm
#node.js #npm
Вопрос:
Я написал пользовательский пакет NPM, который будет запускать для меня издевательский сервер Apollo GraphQL с некоторыми пользовательскими настройками.
В моей /bin
папке у меня есть файл, server.js
который отвечает за раскрутку сервера.
В package.json
я настроил свою команду следующим образом:
...
"bin": {
"mock-server": "./src/server.js"
},
...
Поэтому, когда я запускаю команду mock-server
из родительского проекта, она выполняет server.js
файл.
Пока все хорошо, но проблема в том, что как только я начинаю пытаться требовать зависимости, я сталкиваюсь с этой ошибкой:
$ use-env mock-server
/Users/dev/projects/share-vde-frontend/node_modules/.bin/mock-server: line 1: syntax error near unexpected token `('
/Users/dev/projects/share-vde-frontend/node_modules/.bin/mock-server: line 1: `const { ApolloServer } = require("apollo-server");'
error Command failed with exit code 2.
Мои знания о написании модулей npm основаны только на том, что я видел в пакетах, которые я использовал в прошлом, так что, возможно, я упускаю что-то важное. Нужны ли мне какие-то особые меры при запросе импорта? Или мне нужно собрать и перенести код? Я использую синтаксис ES6, но я уверен, что любой, кто использует этот пакет, будет на современном Node.js версии (пакет является частным и предназначен только для использования в нашей организации).
Комментарии:
1. Я не думаю, что это ошибка из JavaScript, но из вашей оболочки ; есть ли
server.js
#!
строка, определяющая исполняемый файл для использования?2. Нет, это не так. Я думал, что это только для сценариев bash. Как я должен это настроить?
3. Теперь это сценарий оболочки, вот что значит сделать его
bin
исполняемым. Читать docs.npmjs.com/files/package.json#bin .4. О! Это было недостающее звено. Теперь работает после добавления shabang.
Ответ №1:
Основываясь на комментарии от @jonrsharpe выше, я решил эту проблему, добавив шабанг в начало server.js
файла:
#!/usr/bin/env node
const { ApolloServer } = require("apollo-server");
...
Комментарии:
1. Обратите внимание, что это не делает его двоичным исполняемым файлом (и вам также необходимо сделать файл исполняемым с помощью, например
chmod u x <file>
), он просто сообщает вашей оболочке, какой исполняемый файл использовать для его запуска.