【问题标题】:Pass variable to node-gyp when running npm install运行 npm install 时将变量传递给 node-gyp
【发布时间】:2015-09-01 05:13:09
【问题描述】:

我正在使用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 时重建
  • 运行npm install时将参数传递给node-gyp

【问题讨论】:

    标签: node.js npm node-gyp


    【解决方案1】:

    在与@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
    

    【讨论】:

      【解决方案2】:

      我自己没试过,不过根据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
      

      【讨论】:

      • 抱歉,我认为我没有将问题表述得足够精确。由于路径取决于尝试构建插件的用户/系统,因此我无法在 binding.gyppackage.json 中对其进行硬编码。
      • 我明白你的意思。如果我没记错的话,它会是某种重定向。但问题仍然存在:构建包的用户如何确定正确的路径?还是您建议使用read 之类的东西来获取用户输入?
      • 一个不错的 hack,起首!
      • @YanFoto 我可能会建议使用环境变量,这样他们就可以使用env BOOST_PATH=/path/to/boost npm install。我不太了解 Boost,但大型库提供输出相关(lib/include)路径(如pkg-config)的 CLI 工具是相对常见的。如果 Boost 有这样的可执行文件,您可以从构建脚本中调用它。
      • 我认为这是我认为最好的解决方案。您能否将其添加到您的答案中以供将来参考?我想说,目前没有更好的解决方案。对吗?
      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 2021-12-14
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2022-06-22
      • 2020-09-11
      相关资源
      最近更新 更多