npm全局安装不使用节点

我正在尝试创build一个可以在全球范围内安装的软件包。 我的package.json有:

{ "name": "my-new-package", "version": "1.0.0", "main": "index.js", "preferGlobal": true, "bin": { "my-new-package": "index.js" } } 

我可以用“node index.js”运行它,我可以发布到npm。

问题是,当我在全局安装npm i -g my-new-package ,在Windows上my-new-package.cmd文件是:

@"%~dp0\node_modules\my-new-package\index.js" %*

所以当我执行my-new-package它会用默认编辑器打开javascript文件。

相比之下,其他全局软件包使用node.exe 。 这里是cute-files.cmd例子:

 @IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0\node_modules\cute-files\cute-files.js" %* ) ELSE ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% node "%~dp0\node_modules\cute-files\cute-files.js" %* 

顺便说一句,当我在Linux上安装它时,我会得到同样的行为。

那么如何configuration我的软件包以便在全局安装时使用节点?

这里是如何创build一个全局可执行的nodejs包

 mkdir my-new-package cd my-new-package 

首先创buildcat package.json

 { "name": "my-new-package", "version": "1.0.0", "description": "global module my-new-package", "main": "./lib/index.js", "bin": { "my-executable-name": "./bin/test-module.js" }, "author": "", "license": "ISC", "preferGlobal": "true" } 

现在把这两个小孩做成my-new-package孩子

 mkdir bin mkdir lib 

这里是另一个我们需要cat lib/index.js

 var sayHello = function(name) { return 'Hello, ' + name; }; // Allows us to call this function from outside of the library file // Without this, the function would be private to this file exports.sayHello = sayHello; 

现在创build一个文件cat bin/test-module.js

 #!/usr/bin/env node var lib= require('../lib/index.js'); var greeting = lib.sayHello('hello everyone'); console.log(greeting); 

现在进入文件package.json所在的目录my-new-package并发出全局安装命令

 cd my-new-package npm install -g . 

注意上面的安装命令中的时间段

它的输出将是这样的

 /home/stens/node-v6.5.0/bin/my-new-package -> /home/stens/node-v6.5.0/lib/node_modules/my-new-package/bin/test-module.js /home/stens/node-v6.5.0/lib └── my-new-package@1.0.0 

现在它的全球安装,你可以在任何目录中发出这个

 my-executable-name 

它会回应

 Hello, hello everyone 

有趣的是,我们的新可执行文件生存在nodejs全局bin目录中

 which my-executable-name 

回应

 /home/stens/node-v6.5.0/bin/my-executable-name