pojin (ID: 1)
头衔:论坛坛主
等级:究级天王[荣誉]
积分:1301
发帖:99 篇
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
发帖:99 篇
来自:保密
注册:2022-08-28 23:20:57
造访:2025-03-23 21:18:24
[ 第 1 楼 ]
回复

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.*\n/, 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交换前两个目录。返回堆栈中的路径数组。
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.*\n/, 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交换前两个目录。返回堆栈中的路径数组。

