2015-06-16 2 views
0

Я использую node-gyp создать Node.js addon и мой binding.gyp содержит некоторые переменные следующим образом:переменной Pass к узлу-Gyp при выполнении НПМ установки

... 
"link_settings": { 
    "libraries": [ 
     "-lboost_program_options", 
     "-lboost_log", 
    ], 
    "ldflags": [ 
     "-L<@(boost_root)/stage/lib", 
     "-Wl,-rpath,<@(boost_root)/stage/lib", 
    ] 
    }, 
... 

(полный файл Gyp из here). Я использую node-gyp configure --boost_root=/PATH/TO/BOOST build для создания источников C++. Проблема возникает, когда я запускаю npm install, поскольку он просто вызывает node-gyp rebuild без каких-либо параметров.

Есть ли способ сделать одно из следующего?

  • Не запускать node-gyp восстановления при запуске npm install
  • параметров переходят к node-gyp при запуске npm install

ответ

1

После lenghty обсуждения с @robertklep, я узнал, что, пройдя путь как command line flag также решает эту проблему:

npm install --boost_path=/PATH/TO/BOOST 

однако, как он отметил, что не известно, что произойдет, если другой пакет requi res мой пакет и пытается передать ему параметр.

UPDATE:

Как выясняется, это решение может быть применено также, если другой пакет использует оригинальный пакет:

npm link /PATH/TO/ORIGINAL_PACKET --boost_path=/PATH/TO/BOOST 

или если вы установили с непосредственно из менеджера пакетов и сейчас хотите установить его через зависящий пакет:

npm install --boost_path=/PATH/TO/BOOST 
1

Я никогда не пробовал сам, но согласно this вы можете объявить свой собственный скрипт установки в package.json:

"scripts" : { 
    "install" : "node-gyp configure --boost_root=/PATH/TO/BOOST build" 
} 

EDIT: просто попробовал, работает как рекламируется.

Вместо вызова node-gyp из сценария install вы также можете вызвать сценарий оболочки, который вы упаковываете как часть вашего модуля. Например:

"scripts" : { 
    "install" : "./scripts/build.sh" 
} 

Сценарий будет (так или иначе) определить правильные параметры конфигурации и вызвать node-gyp их с помощью:

#!/bin/sh 

...determine correct settings... 

# call node-gyp 
node-gyp configure --boost_root=$BOOST_PATH build 

Убедитесь, что скрипт имеет исполняемые разрешения.

Если вам требуется указать путь, самым простым было бы установить переменную окружения. Предполагая, что это называется BOOST_PATH, это должно работать:

"scripts" : { 
    "install" : "node-gyp configure --boost_root=\"$BOOST_PATH\" build" 
} 

Пользователь может установить его следующим образом:

$ env BOOST_PATH=/PATH/TO/BOOST npm install yourmodule 
+0

Извините, я думаю, что я не сформулировал проблему lem достаточно точно. Поскольку путь зависит от пользователя/системы, пытающейся создать аддон, я не могу его жестко закодировать в 'binding.gyp' или' package.json'. –

+0

@YanFoto см. Редактирование для возможного решения. – robertklep

+0

Я вижу, что вы указываете. Это будет какая-то переадресация, если я не ошибаюсь. Но остается вопрос: как пользователь может создать пакет, определяющий правильный путь? Или вы предлагаете использовать что-то вроде 'read' для ввода пользовательского ввода? –