npm全局安装不使用节点

时间:2016-08-17 17:24:37

标签: node.js npm

我正在尝试创建一个可以全局安装的软件包。我的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上安装时会遇到相同的行为。

那么如何将我的包配置为在全局安装时使用节点?

1 个答案:

答案 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