今天我们要谈论创建 node.js 可执行文件。
我想拥有一个我在我的计算机上打字,然后把它变为其中的一个小熊表情。


目前可以看到我的机器上没有此命令,我们开始动手写一个
开始
准备工程
mkdir node-clicd node-clitouch cli.jstouch bears.txt
bears.txt:
ʕ•ᴥ•ʔˁ˚ᴥ˚ˀʕ·͡ᴥ·ʔóÔÔò(● ̄(エ) ̄ ●)⊂(・(ェ)・)⊃ʕ•͡ ᴥ•͡ ʔʕ•͡ᴥ•ʔ(●`・(エ)・ ´●)ʕノ•ᴥ•ʔノ ︵ ┻━┻
cli.js :
#!/usr/bin/env nodeconst fs = require("fs");fs.readFile("bears.txt", (err, data) => {const bears = data.toString().split("\n");const bear = bears[Math.floor(Math.random() * bears.length)];console.log(bear);});
让我们把所有的代码逐行说说。
#!/usr/bin/env node是一个 shebang 行的实例,它告诉我们的系统用什么解释器来执行该文件fs.readFile(...)引用fs模块读取文件bears.txt内容const bears = ...将文件流转换成字符串,用换行符(\n)分割字符串成为数组const bear = ...在bears数组随机取出一个元素console.log(bear);在控制台中打印出取出的元素
执行 node cli.js 结果如下

每次随机打印出一个小熊
到现在我们还不能执行这个文件,执行./cli.js 不会有任何结果,这是因为当前文件还是不可执行的。

我们通过chmod +x cli.js 来修改当前文件可以执行

这个时候我们就可以执行 ./cli.js 了
回到最初想法,我们想在命令行输入 bearme 就会执行 cli.js 这时候需要添加package.json 信息
npm init -y
修改如下:
{"name": "bearme","version": "1.1.0","description": "","main": "cli.js","bin": {"bearme": "cli.js"},"scripts": {"start": "node index.js","test": "node test.js"},"preferGlobal": true,"author": "","license": "MIT"}
这个时候还不能全局执行,想要全局可以执行有两种方法
- 发布这个包到
npmjs.com,然后全局安装npm i bearme -g - 使用
npm link创建一个全局连接
发布 CLI 到 NPM
在部署之前,我们需要在 package.json 中添加一些信息。
"homepage": "YOUR GITHUB REPO OR SITE HERE","repository": {"type": "git","url": "git+YOUR GITHUB REPOSITORY HERE"},"engines": {"node": ">=8"},
- homepage 和 repository 要填写你自己的 GitHub 项目地址
- engines 确认
nodejs版本号,简单地定义了你的项目应该在最小版本的节点上工作。 版本号取决于你用了那些版本的特性。
下面是接下来的步骤。
- 在
npmjs.com上创建一个账户(可选,如果有可以忽略) - 运行
npm login命令并输入你的信息 - 运行
npm publish命令,它将在几分钟内自动发布。
npm link
和上面方法二者选其一,在当前目录下执行 npm link
执行bearme 看看效果

就是这样! 动手创建了一个命令行工具
