运行npm install

时间:2015-06-16 11:47:46

标签: node.js npm node-gyp

我正在使用node-gyp创建Node.js addon,而我的binding.gyp包含一些变量,如下所示:

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

(来自here的完整gyp文件)。我使用node-gyp configure --boost_root=/PATH/TO/BOOST build来构建C++来源。当我运行npm install时会出现问题,因为它只调用node-gyp rebuild而没有任何参数。

有没有办法做以下任何一种情况?

  • 运行node-gyp
  • 时未运行npm install重建
  • 运行node-gyp
  • 时将参数传递给npm install

2 个答案:

答案 0 :(得分:2)

在与@robertklep进行了长时间的讨论之后,我发现将路径作为command line flag传递也解决了这个问题:

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

然而,正如他所提到的那样,如果另一个包需要我的包并尝试将参数传递给它,那么会发生什么。

<强>更新

事实证明,如果另一个包使用原始包,也可以应用此解决方案:

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

或者如果您已直接从软件包管理器安装,现在想通过依赖软件包安装它:

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

答案 1 :(得分:1)

我从未尝试过自己,但根据this,您可以在package.json中声明自己的安装脚本:

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

编辑:刚试过,按照宣传的方式工作。

您也可以调用作为模块一部分打包的shell脚本,而不是从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