通过可执行(.bin)npm脚本调用时将参数传递给节点

时间:2017-02-11 19:35:26

标签: npm command-line-interface yarnpkg npm-scripts

我已将npm CLI命令定义为mycommand模块:

{
  ...
  "name": "mycommand",
  "bin": {
    "mycommand": "bin/mycommand.js"
  },
  ...
}

mycommand.js看起来像这样:

#!/usr/bin/env node --harmony

console.log('...')

我希望能够以下列方式运行它,安装在另一个模块中

{
  ..
  "scripts": {
    "mycommand": "mycommand --require ./bootstrap"
  }
  ...      
}

其中bootstrap是我期望require的模块 - 在mycommand之前编辑。 --require参数应该传递给运行mycommand的节点。

结果&尝试

  1. 不幸的是,bootstrap永远不需要。没有错误或其他错误路径解析的指示或某些此类错误。

  2. 如果我以不同的方式定义mycommand脚本:

    {
      ...
      "scripts": {
        "mycommand": "node --require ./bootstrap ./some-random-js-file"
      }
      ...      
    }
    
  3. bootstrap是必需的,证明bootstrap存在且--require有效。

    1. 如果我require bootstrap模块直接在mycommand(我不能真正做到 - 那么只是为了测试):

      #!/usr/bin/env node --harmony
      require('../../../bootstrap');
      console.log('...')
      
    2. 按预期需要

      bootstrap注意 ../../../可以补偿mycommand.jsnode_modules内的位置。

      假设

      我假设--require实际上从未传递给执行mycommand的节点。

      问题

      如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您认为--require永远不会传递给node的假设是正确的:

  • 当您运行node --require … path/to/mycommand.js 时,您将参数传递给node

  • 当您运行mycommand --require … 时,您将参数传递给mycommand

(如果符合您的使用案例,您可以解析mycommand.jsrequire()中的命令行选项。

我假设您不想使用node … mycommand.js方法,因为您需要指定脚本的路径,从而忽略了创建bin字段的重点首先。

但是,由于您提供了bin字段,因此您已经知道mycommand的路径:

{
  ..
  "scripts": {
      "mycommand": "node --require ./bootstrap ./node_bin/mycommand"
  }
  ...      
}

或者可以是… $(npm bin)/mycommand