我正在尝试创建一个可以全局安装的软件包。我的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上安装时会遇到相同的行为。
那么如何将我的包配置为在全局安装时使用节点?
答案 0 :(得分:2)
以下是如何创建全局可执行的nodejs包
mkdir my-new-package
cd my-new-package
首先创建cat 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"
}
现在将这两个目录作为dir 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;
现在创建一个文件cat bin/test-module.js
#!/usr/bin/env node
var lib= require('../lib/index.js');
var greeting = lib.sayHello('hello everyone');
console.log(greeting);
现在进入文件my-new-package
所在的目录package.json
并发出全局安装命令
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