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