运行npm install时如何向node-gyp传递变量

3

我正在使用 node-gyp 来创建一个 Node.js 插件,我的 binding.gyp 文件包含以下一些变量:

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

(完整的gyp文件可以从这里获取). 我使用node-gyp configure --boost_root=/PATH/TO/BOOST build来构建C++源代码。问题在于当我运行npm install时,它只是调用node-gyp rebuild而没有任何参数。

有没有办法做到以下之一?

  • 在运行npm install时不运行node-gyp rebuild
  • 在运行npm install时向node-gyp传递参数
2个回答

2

在与@robertklep进行了长时间的讨论后,我发现将路径作为命令行标志传递也可以解决这个问题:

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

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

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

编辑: 刚刚尝试过,效果如广告所述。

你可以不从install脚本中调用node-gyp,而是调用一个作为模块一部分打包的shell脚本。例如:

"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

我明白你的意思。如果我没弄错的话,这应该是某种重定向。但问题仍然存在:用户如何构建包并确定正确的路径?或者您建议使用类似于“read”来获取用户输入吗? - Yan Foto
一个不错的hack,不过干得好! - Yan Foto
你可能不会相信,但是将 boost_path 作为 命令行标志 添加到 npm 中可以解决这个问题:npm install --boost_pat=/PATH/TO/BOOST。我应该将其添加到您的答案顶部吗? - Yan Foto
@YanFoto 哈哈 :) 我建议将其作为单独的答案添加(并且由于它更容易,可以自由地接受它作为您问题的答案!)。一个可能的问题是,如果其他项目将您的模块声明为依赖项,则可能不再起作用,但您必须尝试确保。 - robertklep
让我们在聊天中继续这个讨论 - Yan Foto
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接