本文概述
许多开发人员每天都会在NPM上发布其软件包。它们中的大多数非常有用, 它们通过代码和命令行来提供模块的用法, 但是并不是所有它们都全局地公开其模块(不是因为你没有使用-g标志执行install命令, 而是模块ain’ t配置为全局使用)。如果他们提供的实用程序(script.js)可以执行某些特殊操作, 则要从命令行执行该实用程序, 你将需要提供脚本路径并使用node调用它:
node ../path/to/my-awesome/tool/script.js --arguments somevalue
如果你经常使用它, 会有些痛苦。相反, 你想要的是, 应用程序开发人员具有一定的权限, 独创性, 并像著名的框架和工具集(例如Cordova或TypeScript)那样公开应用程序的全局命令, 将工具名作为命令指令, 而其余命令:
cordova do-something
REM or other tools
tsc do-other-thing
nodemon do-other-thing
对你自己的模块执行相同的操作会更好:
mymodule do-something
在本文中, 你将学习如何轻松地为全局安装创建合适的模块。
1.创建一个普通模块
作为第一步, 继续创建一个空模块。我们的模块名称将是custom-toolkit(根据需要更改), 位于桌面中的custom-toolkit文件夹内, 在custom-toolkit文件夹内, 创建一个新文件夹, 其中将包含名称为lib的模块代码, 最后在lib文件夹中创建一个具有以下内容的单个文件(index.js):
// ./lib/index.js
/**
* Displays a string in the console
*
* @param {string_to_say} String string to show in the console
*/
var say = function(string_to_say) {
return console.log(string_to_say);
};
// Allows us to call this function from outside of the library file.
// Without this, the function would be private to this file.
exports.say = say;
我们模块的主要脚本将公开say方法, 该方法在控制台中显示一些文本。你可以使用npm init创建模块(创建package.json):
或手动创建具有以下内容的package.json(更改除主字段之外的所需字段):
{
"name": "custom-toolkit", "version": "1.0.0", "description": "An awesome custom global module", "main": "./lib/index.js", "scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}, "author": "ourcodeworld", "license": "MIT"
}
对于我们的示例模块来说就足够了, 简单不是吗?该模块的结构为:
2.创建全局模块文件
在模块的根目录内创建一个名为bin的新文件夹, 并在其中包含以下内容的新js文件(demo-global.js):
#!/usr/bin/env node
var myLibrary = require('../lib/index.js');
// Displays the text in the console
myLibrary.say('Jack, get back, come on before we crack Lose your blues, everybody cut footloose');
重要
请注意, 第一行(#!/ usr / bin / env节点)将允许npm为该模块正确生成可执行文件。如果有人在Windows中工作, 它将忽略shebang行#!/ usr / bin / env节点, 并将根据.js文件关联执行它。
如果打包为npm, 请使用package.json中的bin属性(这是我们将在第3步中执行的操作)。然后在Windows上, Npm将在脚本旁边安装.cmd包装器, 以便用户可以从命令行执行它
该脚本demo-global.js将是我们将在package.json上使用自定义名称在全球范围内公开的脚本。
3.公开你的模块以进行全局安装
在这种情况下, 我们希望我们的全局模块具有名称dosomethingawesome, npm使其非常容易, 要注册我们的全局模块, 我们需要在package.json中指定bin属性。请注意, 你可以执行任意数量的命令, 许多程序包都具有一个或多个可执行文件, 这些文件要安装到PATH中。
编辑package.json并注册执行demo-global.js脚本的dosomethingawesome指令:
{
...
"bin": {
"dosomethingawesome": "./bin/demo-global.js"
}, ..-
}
当有人使用npm install -g yourmodule安装你的模块时, 这足以在全球范围内注册该模块。请注意, 如果你的软件包主要是应全局安装的命令行应用程序, 则可以将preferredGlobal属性添加到true, 以在安装在本地时提供警告。它实际上并不能阻止用户在本地安装它, 但是可以防止某些无法正常使用的混乱:
{
...
"preferGlobal": true, ..-
}
然后, 你的package.json应该最终看起来像:
{
"name": "custom-toolkit", "version": "1.0.0", "description": "An awesome custom global module", "main": "./lib/index.js", "scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}, "bin": {
"dosomethingawesome": "./bin/demo-global.js"
}, "preferGlobal": true, "author": "ourcodeworld", "license": "MIT"
}
这样就可以安装模块了。
4.安装模块
最后一步由你决定, 你只需要以所需的方式全局安装模块即可。你可以从本地安装它, 然后在Github上发布, 然后在NPM上发布。在这种情况下, 我们将从桌面上的文件夹全局安装模块, 因此我们的命令理论上是npm install -g custom-toolkit看起来像:
npm install -g C:\Users\sdkca\Desktop\custom-toolkit
请记住添加-g标志以全局安装软件包, 你就可以开始了。现在, 你的模块(公开的dosomethingawesome指令)随处可用:
要卸载它(即使从本地安装), 请执行npm uninstall -g custom-toolkit。
最后提示
教程解释得尽可能简单。如果要增加第一个全局模块的复杂性, 那么显然可以使用自变量(CLI的常规任务)。以下修改后的脚本将接受并期望名称作为我们dosomethingawesome命令的参数:
#!/usr/bin/env node
// Delete the 0 and 1 argument (node and script.js)
var args = process.argv.splice(process.execArgv.length + 2);
// Retrieve the first argument
var name = args[0];
var myLibrary = require('../lib/index.js');
// Displays the text in the console
myLibrary.say(name + ', get back, come on before we crack Lose your blues, everybody cut footloose');
可以通过以下方式触发:
dosomethingawesome Carlos
并会生成输出:
如果你真的想在脚本中使用参数和选项, 我们建议你使用库将它们作为命令行参数或stdio进行操作。
编码愉快!
评论前必须登录!
注册