资讯专栏INFORMATION COLUMN

使用ShellJS提升你的开发效率(一)

anRui / 2684人阅读

摘要:返回堆栈中的路径数组。如果没有给出参数,将从堆栈中删除顶级目录并执行到新的顶级目录。

Shelljs - Unix shell commands for Node.js

Shelljs是Node.js下的脚本语言解析器,具有丰富且强大的底层操作(Windows/Linux/OS X)权限。Shelljs本质就是基于node的一层命令封装插件,让前端开发者可以不依赖linux也不依赖类似于cmder的转换工具,而是直接在我们最熟悉不过的javascript代码中编写shell命令实现功能。

解决问题

shell脚本对于前端都不陌生,在package.json配置里大家已经使用了,以"build": "umi build && node zip.config.js"为例,npm run build先会执行umi build后会执行zip.config.js的脚本,zip.config.js脚本做的事就是if无build文件夹,则生成build文件夹并借助easyzip进行压缩打包,else存在build文件夹,则生成zip压缩包或者其他公司需要的文件。
shelljs做的事就是自动化,从耗时的重复性常规动作里解放出来,提升开发效率和工作心情。

基本语法

//引入shelljs var shell = require("shelljs") //检查控制台是否以运行`git `开头的命令 if (!shell.which("git")) { //在控制台输出内容 shell.echo("Sorry, this script requires git"); shell.exit(1); } shell.rm("-rf","out/Release");//强制递归删除`out/Release目录` shell.cp("-R","stuff/","out/Release");//将`stuff/`中所有内容拷贝至`out/Release`目录 shell.cd("lib");//进入`lib`目录 //找出所有的扩展名为js的文件,并遍历进行操作 shell.ls("*.js").forEach(function (file) { /* 这是第一个难点:sed流编辑器,建议专题学习,-i表示直接作用源文件 */ //将build_version字段替换为"v0.1.2" shell.sed("-i", "BUILD_VERSION", "v0.1.2", file); //将包含`REMOVE_THIS_LINE`字符串的行删除 shell.sed("-i", /^.*REMOVE_THIS_LINE.*$/, "", file); //将包含`REPLACE_LINE_WITH_MACRO`字符串的行替换为`macro.js`中的内容 shell.sed("-i", /.*REPLACE_LINE_WITH_MACRO.* /, shell.cat("macro.js"), file); }); //返回上一级目录 shell.cd(".."); //run external tool synchronously //即同步运行外部工具 if (shell.exec("git commit -am "Auto-commit"").code !== 0){ shell.echo("Error: Git commit failed"); shell.exit(1); }

示例解释

shell.which(command)

在环境变量PATH中寻找指定命令的地址,判断该命令是否可执行,返回该命令的绝对地址

echo

在控制台输出指定内容
.to(index.txt)写入文件

exit(code)
以退出码为code退出当前进程

rm([options,] file [,file ...])

删除一个目录中一个或多个文件或目录,一旦删除,无法恢复。

常用参数:

    -f:强制删除文件;

    -i:删除之前先询问用户;

    -r:递归处理目录;

    -v:显示处理过程;

shell.rm("-rf", staticSplash);

cp([options,] source_array, dest) cp("-R","index.txt", "~/newCopy/") cp("-R",["index.txt", "old.txt"], "~/newCopy/")

用来将一个或多个源文件或目录复制到指定的文件或目录。

常用参数:

    -f:force (default behavior)

    -L: follow symlinks

    -r,-R: recursive

    -n: no-clobber

    -u: only copy if source is newer than dest

    -P: don"t follow symlinks

cd

切换工作目录至指定的相对路径或绝对路径。cd..为返回上一级,cd-回到前一目录。

ls

用来显示目标列表。

常用参数:

    -a:显示所有文件;

    -C:多列显示查询结果;

    -l:单列长格式显示查询结果(与-C相反);

    -R:递归处理目录;

    -A:所有文件(包括开头的文件.,除了.和..)

    -d:列出目录本身,而不是其内容

ls(path.join("bundle", "css/")).forEach(cssName => { *** })

sed([options,] search_regex, replacement, file_array

将file_array中符合search_regex的内容替换为replacement,支持正则的捕获组自引用。一次处理一行内容,处理完成后把缓冲区内容送往屏幕,然后处理下一行,循环直至结束。

常用参数:

    -i:直接作用源文件

cat([options,] file [, file ...])

将一个或多个文件内容读入,指定一个文件时读入该文件,指定多个文件时将内容连接在一起读入。

可用选项:
-n: number all output lines

exec(command [, options] [, callback])

执行所传入的命令

    async:是否异步执行,默认false,传入callback时自动开启

    slient:不输出信息到console,默认false

    encoding:默认utf8

    除非另有说明,否则command 同步执行给定的给定。在同步 模式下,它返回一个ShellString(与ShellJS v0.6.x兼容,返回 表单的对象{ code:..., stdout:... , stderr:... })。否则,这将返回子进程 对象,并callback获取参数(code, stdout, stderr)。
    注意:对于长期存在的进程,最好以exec()异步方式运行

chmod

设置文件调用权限

    -c:output a diagnostic for every file processed

    -v: like verbose, but report only when a change is made

    -R: change files and directories recursively

u表示该文件拥有者,g表示同一群体者,o表示其他,a表示所有
+表示增加权限,-表示取消权限,=表示唯一设定权限
r表示可读,w表示可写,x表示可执行,X表示当该文件是个子目录

chmod(755, "/Users/brandon"); chmod("755", "/Users/brandon"); // same as above chmod("u+x", "/Users/brandon"); chmod("-R", "a-w", "/Users/brandon");

pushd([options,] [dir |"-N"|"+ N"])

可用选项
-n:在向堆栈添加目录时禁止正常更改目录,以便仅操作堆栈

参数

    dir:使当前工作目录成为堆栈的顶部,然后执行等效的cd dir

    +N:通过旋转堆栈将第N个目录(从dirs打印的列表的左侧开始,从零开始)到列表的顶部

    -N:通过旋转堆栈将第N个目录(从dirs打印的列表右侧开始,从零开始计数)到列表顶部

echo(process.cwd()); // 当前文件父路径 /Users... pushd("/etc") // /private/etc /Users... pushd("+1") // users... /private/etc

将当前目录保存在目录堆栈的顶部,然后cd到dir。没有参数,pushd交换前两个目录。返回堆栈中的路径数组。

popd([options,] [" - N"|"+ N"])

可用选项:
-n:从堆栈中删除目录时禁止正常更改目录,以便仅操作堆栈

参数:

    +N:删除第N个目录(从dirs打印的列表左侧开始计算),从零开始

    -N:删除第N个目录(从dirs打印的列表右侧开始计算),从零开始。

echo(process.cwd()); // "/usr" pushd("/etc"); // "/etc /usr" echo(process.cwd()); // "/etc" popd(); // "/usr" echo(process.cwd()); // "/usr"

如果没有给出参数,popd将从堆栈中删除顶级目录并执行cd到新的顶级目录。从dirs列出的第一个目录开始,元素从0开始编号; 即,popd相当于popd +0。返回堆栈中的路径数组

dirs([options |"+ N"|"-N"]

可用选项:
-c:通过删除所有元素清除目录堆栈

参数:

    +N:显示第N个目录(从没有选项调用时由dirs打印的列表左侧开始计数),从零开始

    -N:显示第N个目录(从没有选项调用时由dirs打印的列表右侧开始计数),从零开始

显示当前记住的目录列表。返回堆栈中的路径数组,如果指定了+ N或-N,则返回单个路径。

find(path [,path ...])

查找文件

console.log(find("../Config/application.js"))

返回path_array

grep([options,] regex_filter,file [,file ...])

不同于fing查找文件,grep用于查找内容

可用选项:

    -v:反转正则表达式的意义并打印不符合条件的行

    -l:仅打印匹配文件的文件名

grep("-v", "GLOBAL_VARIABLE", "*.js"); grep("GLOBAL_VARIABLE", "*.js");

从给定文件中读取输入字符串,并返回一个字符串,其中包含 与给定文件匹配的文件的所有行regex_filter

head([{" - n":},] file [,file ...])

读取文件的开头

可用选项:
-n :显示文件的第一行

console.log(head("bundle.js")) console.log(head({"-n":1},"bundle.js")) // 获取第一行

tail([{" - n":},] file [,file ...])

读取文件的结尾

可用选项: -n :显示文件的最后几行

var str = tail({"-n": 1}, "file*.txt"); var str = tail("file1", "file2"); var str = tail(["file1", "file2"]); // same as above

ln([options,] source,dest)

创建链接

ln("file", "newlink"); // /Users.../newlink ln("-sf", "file", "newlink"); //如果newlink存在,则强制链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/6705.html

相关文章

  • shelljs实现前端部署自动化

    摘要:一场景在前端开发过程中,你肯定经常使用到以下等命令本人在用写我的个人博客时,将其部署到上。每一次部署,都要将上面的命令敲一遍,实在令我很痛苦。安装有两种使用方式,一种是全局模式对应全局安装一种是局部模式。 一、场景 在前端开发过程中,你肯定经常使用到以下等命令: npm run build git add . git commit -m commit git push 本人在用vue...

    lemanli 评论0 收藏0
  • Nodejs开发简单的脚手架工具

    摘要:本文主要是介绍开发一个简单的脚手架,了解开发的基本流程最终通过链接到全局包。完成之后,就可以把脚手架发布到上面,通过进行全局安装,就可以在自己本机上执行来初始化项目,这样便完成了一个简单的脚手架工具了。 脚手架,这个名词对于作为前端的我们来说,也许并不陌生吧,像vue-cli,react-native-cli等,全局安装后,只需要在命令行中敲入一个简单的命令,便可帮我们快速的生成一个初...

    sean 评论0 收藏0
  • 如何用node开发自己的cli工具

    摘要:新建文件夹这是一个规范,可执行工具的老家。然后输入接下来会以问答的形式向你了解你的用户名密码以及公开的邮箱,之后输入注意发布的源别是淘宝源,否则哦然后看到进度条走,之后组件发布成功,可以到上搜索自己的包了。 如何用node开发自己的cli工具 灵感 写这个工具的灵感以及场景源于youtube的一次闲聊 github 地址 blog首发 showImg(https://segment...

    pkwenda 评论0 收藏0
  • 如何用node开发自己的cli工具

    摘要:新建文件夹这是一个规范,可执行工具的老家。然后输入接下来会以问答的形式向你了解你的用户名密码以及公开的邮箱,之后输入注意发布的源别是淘宝源,否则哦然后看到进度条走,之后组件发布成功,可以到上搜索自己的包了。 如何用node开发自己的cli工具 灵感 写这个工具的灵感以及场景源于youtube的一次闲聊 github 地址 blog首发 showImg(https://segment...

    Bmob 评论0 收藏0
  • 如何用node开发自己的cli工具

    摘要:新建文件夹这是一个规范,可执行工具的老家。然后输入接下来会以问答的形式向你了解你的用户名密码以及公开的邮箱,之后输入注意发布的源别是淘宝源,否则哦然后看到进度条走,之后组件发布成功,可以到上搜索自己的包了。 如何用node开发自己的cli工具 灵感 写这个工具的灵感以及场景源于youtube的一次闲聊 github 地址 blog首发 showImg(https://segment...

    Raaabbit 评论0 收藏0

发表评论

0条评论

anRui

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<