今天我们要谈论创建 node.js 可执行文件。
我想拥有一个我在我的计算机上打字,然后把它变为其中的一个小熊表情。
目前可以看到我的机器上没有此命令,我们开始动手写一个
开始
准备工程
mkdir node-cli
cd node-cli
touch cli.js
touch bears.txt
bears.txt
:
ʕ•ᴥ•ʔ
ˁ˚ᴥ˚ˀ
ʕ·͡ᴥ·ʔ
óÔÔò
(● ̄(エ) ̄ ●)
⊂(・(ェ)・)⊃
ʕ•͡ ᴥ•͡ ʔ
ʕ•͡ᴥ•ʔ
(●`・(エ)・ ´●)
ʕノ•ᴥ•ʔノ ︵ ┻━┻
cli.js
:
#!/usr/bin/env node
const 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
看看效果
就是这样! 动手创建了一个命令行工具