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



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

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

其中mycommand.js如下所示:

#!/usr/bin/env node --harmony
console.log('...')

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

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

其中CCD_ 3是我期望在CCD_ 5之前被CCD_。--require参数应该传递给运行mycommand的Node。

结果&尝试次数

  1. 不幸的是,bootstrap从来都不是必需的没有错误或其他路径分辨率不正确的指示。

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

    {
    ...
    "scripts": {
    "mycommand": "node --require ./bootstrap ./some-random-js-file"
    }
    ...      
    }
    

bootstrap如预期的那样是必需的,证明bootstrap存在并且--require工作。

  1. 如果我直接在mycommandrequirebootstrap模块(我真的做不到——所以只是为了测试):

    #!/usr/bin/env node --harmony
    require('../../../bootstrap');
    console.log('...')
    

bootstrap按预期是必需的注意../../../用于补偿mycommand.jsnode_modules中的位置。

假设

我假设CCD_ 20从未实际传递给执行CCD_ 21的Node。

问题

如何做到这一点?

您关于--require从未传递给node的假设是正确的:

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

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

(如果适合您的用例,您可以根据需要解析mycommand.jsrequire()中的命令行选项)

我假设您不想使用bootstrap0方法,因为您需要指定脚本的路径,从而失去了创建bin字段的全部意义。

但是,由于您已经提供了一个bin字段,您就已经有了一个通往mycommand:的已知路径

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

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

相关内容

最新更新