前言
CLI(Command-Line Interface) 命令行界面
搞开发的同学,或多或少的都会接触到许多的命令行工具。
有生产力工具,也有有意思的小玩意、自动化任务处理等等。
命令行工具的安装方式就很多了。
win
上大部分是通过软件安装包安装,安装同时会通过环境变量
配置相关指令。
linux
和mac
上就比较丰富了,前者常用yum
和api-get
、mac 上就brew
。
也有使用wget
和curl
拉取相关工具的shell
脚本执行安装。
说了这么多工具,都不是本文要讲的工具,前端搬砖当然首选node
,然后基于npm
做包的分发。
PS:文中的示例都以mac
为主
可执行shell
unix
系上大部分可执行文件都是基于shell
的脚本。
比如随手写个hello world
文件名hello
,内容如下
echo "Hello world"
此时我们直接执行是会提醒没有执行权限,我们为当前用户加1个可执行权限
chmod u+x hello
然后再当前目录执行,就看到输出结果了
./hello
注册全局指令
为了使“指令”在全局任意位置都能被使用,就需要做相关操作了。
环境变量
相信大多数首次接触这个词的朋友都在windows
上深有体会。装JDK
、MySQL
时都避免不了有配置的操作。
如果想在其它目录直接执行hello
就生效呢?那这就离不开环境变量配置了
mac上配置文件区别于使用的shell
执行工具
咱们先看终端用的shell
工具是什么。
echo $0
我这里使用的是zsh
,其它的常见的还有bash
相应的配置文件分别是.zshrc
和.bashrc
alias指令
使用 alias指令设置别名
指令格式
alias <别名>=<指令或可执行文件路径>
添加内容如下
alias hello=/Users/sugar/Documents/diy-cli/hello
立即生效配置
source ~/.zshrc
export指令
使用export命令添加添加相关目录
指令格式
export PATH=$PATH:<路径 1>:<路径 2>:<路径 N>
添加内容如下
export PATH=$PATH:/Users/sugar/Documents/diy-cli
以上2种方案都能达到目标的效果
如果每个工具都单独配一条规则。那会导致相关配置文件非常的庞大,也不方便维护。
实际上我们在用npm i -g
安装的全局包的时候,并没有手动配置。那么这个是如何做到的呢。这个就离不开下面将要说到的符号链接
了
符号链接
软链接
类似于快捷方式,它可以指向任意文件系统中的一个文件或目录;硬链接也可以看作是文件或目录的快捷方式,但源文件删除了也不影响硬链接
。
先通过which npm
看一下npm所在位置
打印一下$PATH
的值,可以看到npm
指令对应文件所在目录就在其中
展开目录内容可以看到文件类型都是l(软连接)
因此咱们可以小结出来 通过向已添加到$PATH变量中的目录,直接创建短链可以实现指令的自动注册全局
下面实践演示一下
ln指令
指令格式
# 硬链接 ln source target # 软连接 ln -s source target
接着上面之前的例子,再使用export
完成对目录的添加后。咱们再随便建立个文件hello2.sh
进行操作
内容如下
echo "Hello world2"
创建一个软链
ln -s <source>/hello.sh <target>/hello2
操作结果如下
前面代码都是简单的写的shell
脚本
前端当然是羧js
,咱们把代码改成js。
hello.js
console.log('hello js')
结果可以预测是会报错的,默认会被当做shell
脚本进行执行。
那么如何指定为使用node
去执行这个文件?
这就是我们下文要说到的hashbang
Hashbang
Hashbang
(也称为Shebang
)是一个由井号和叹号构成的字符序列 #!,通常出现在文件开头,例如#!/usr/bin/env bash
用于指定脚本的运行环境
于是,我们给前面的hello.js
头部加上#!/usr/bin/env node
再次运行就成了
至此基本清楚了,如何将1个js
脚本便捷的注册为1个全局可执行指令
Node CLI
node
官配包管理工具npm
,通常每个项目中有一个package.json
文件,用于描述项目的一些信息或者包含项目相关的配置内容
指令注册
其中bin
属性用于设置指令名称
和执行脚本所在位置
{ "name":"pkgName", "bin": { "command": "exec/filepath.js" } }
Node CLI工具原理解析(2):https://developer.aliyun.com/article/1394836?spm=a2c6h.13148508.setting.15.55964f0ez7IHhI