摘要:返回堆棧中的路徑數(shù)組。如果沒(méi)有給出參數(shù),將從堆棧中刪除頂級(jí)目錄并執(zhí)行到新的頂級(jí)目錄。
Shelljs - Unix shell commands for Node.js
Shelljs是Node.js下的腳本語(yǔ)言解析器,具有豐富且強(qiáng)大的底層操作(Windows/Linux/OS X)權(quán)限。Shelljs本質(zhì)就是基于node的一層命令封裝插件,讓前端開(kāi)發(fā)者可以不依賴linux也不依賴類似于cmder的轉(zhuǎn)換工具,而是直接在我們最熟悉不過(guò)的javascript代碼中編寫(xiě)shell命令實(shí)現(xiàn)功能。
解決問(wèn)題
shell腳本對(duì)于前端都不陌生,在package.json配置里大家已經(jīng)使用了,以"build": "umi build && node zip.config.js"為例,npm run build先會(huì)執(zhí)行umi build后會(huì)執(zhí)行zip.config.js的腳本,zip.config.js腳本做的事就是if無(wú)build文件夾,則生成build文件夾并借助easyzip進(jìn)行壓縮打包,else存在build文件夾,則生成zip壓縮包或者其他公司需要的文件。
shelljs做的事就是自動(dòng)化,從耗時(shí)的重復(fù)性常規(guī)動(dòng)作里解放出來(lái),提升開(kāi)發(fā)效率和工作心情。
基本語(yǔ)法
//引入shelljs var shell = require("shelljs") //檢查控制臺(tái)是否以運(yùn)行`git `開(kāi)頭的命令 if (!shell.which("git")) { //在控制臺(tái)輸出內(nèi)容 shell.echo("Sorry, this script requires git"); shell.exit(1); } shell.rm("-rf","out/Release");//強(qiáng)制遞歸刪除`out/Release目錄` shell.cp("-R","stuff/","out/Release");//將`stuff/`中所有內(nèi)容拷貝至`out/Release`目錄 shell.cd("lib");//進(jìn)入`lib`目錄 //找出所有的擴(kuò)展名為js的文件,并遍歷進(jìn)行操作 shell.ls("*.js").forEach(function (file) { /* 這是第一個(gè)難點(diǎn):sed流編輯器,建議專題學(xué)習(xí),-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`中的內(nèi)容 shell.sed("-i", /.*REPLACE_LINE_WITH_MACRO.* /, shell.cat("macro.js"), file); }); //返回上一級(jí)目錄 shell.cd(".."); //run external tool synchronously //即同步運(yùn)行外部工具 if (shell.exec("git commit -am "Auto-commit"").code !== 0){ shell.echo("Error: Git commit failed"); shell.exit(1); }
示例解釋
shell.which(command)
在環(huán)境變量PATH中尋找指定命令的地址,判斷該命令是否可執(zhí)行,返回該命令的絕對(duì)地址
echo
在控制臺(tái)輸出指定內(nèi)容
.to(index.txt)寫(xiě)入文件
exit(code)
以退出碼為code退出當(dāng)前進(jìn)程
rm([options,] file [,file ...])
刪除一個(gè)目錄中一個(gè)或多個(gè)文件或目錄,一旦刪除,無(wú)法恢復(fù)。
常用參數(shù):
-f:強(qiáng)制刪除文件;
-i:刪除之前先詢問(wèn)用戶;
-r:遞歸處理目錄;
-v:顯示處理過(guò)程;
shell.rm("-rf", staticSplash);
cp([options,] source_array, dest) cp("-R","index.txt", "~/newCopy/") cp("-R",["index.txt", "old.txt"], "~/newCopy/")
用來(lái)將一個(gè)或多個(gè)源文件或目錄復(fù)制到指定的文件或目錄。
常用參數(shù):
-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
切換工作目錄至指定的相對(duì)路徑或絕對(duì)路徑。cd..為返回上一級(jí),cd-回到前一目錄。
ls
用來(lái)顯示目標(biāo)列表。
常用參數(shù):
-a:顯示所有文件;
-C:多列顯示查詢結(jié)果;
-l:單列長(zhǎng)格式顯示查詢結(jié)果(與-C相反);
-R:遞歸處理目錄;
-A:所有文件(包括開(kāi)頭的文件.,除了.和..)
-d:列出目錄本身,而不是其內(nèi)容
ls(path.join("bundle", "css/")).forEach(cssName => { *** })
sed([options,] search_regex, replacement, file_array
將file_array中符合search_regex的內(nèi)容替換為replacement,支持正則的捕獲組自引用。一次處理一行內(nèi)容,處理完成后把緩沖區(qū)內(nèi)容送往屏幕,然后處理下一行,循環(huán)直至結(jié)束。
常用參數(shù):
-i:直接作用源文件
cat([options,] file [, file ...])
將一個(gè)或多個(gè)文件內(nèi)容讀入,指定一個(gè)文件時(shí)讀入該文件,指定多個(gè)文件時(shí)將內(nèi)容連接在一起讀入。
可用選項(xiàng):
-n: number all output lines
exec(command [, options] [, callback])
執(zhí)行所傳入的命令
async:是否異步執(zhí)行,默認(rèn)false,傳入callback時(shí)自動(dòng)開(kāi)啟
slient:不輸出信息到console,默認(rèn)false
encoding:默認(rèn)utf8
除非另有說(shuō)明,否則command 同步執(zhí)行給定的給定。在同步
模式下,它返回一個(gè)ShellString(與ShellJS v0.6.x兼容,返回
表單的對(duì)象{ code:..., stdout:... , stderr:... })。否則,這將返回子進(jìn)程
對(duì)象,并callback獲取參數(shù)(code, stdout, stderr)。
注意:對(duì)于長(zhǎng)期存在的進(jìn)程,最好以exec()異步方式運(yùn)行
chmod
設(shè)置文件調(diào)用權(quán)限
-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表示所有
+表示增加權(quán)限,-表示取消權(quán)限,=表示唯一設(shè)定權(quán)限
r表示可讀,w表示可寫(xiě),x表示可執(zhí)行,X表示當(dāng)該文件是個(gè)子目錄
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"])
可用選項(xiàng)
-n:在向堆棧添加目錄時(shí)禁止正常更改目錄,以便僅操作堆棧
參數(shù)
dir:使當(dāng)前工作目錄成為堆棧的頂部,然后執(zhí)行等效的cd dir
+N:通過(guò)旋轉(zhuǎn)堆棧將第N個(gè)目錄(從dirs打印的列表的左側(cè)開(kāi)始,從零開(kāi)始)到列表的頂部
-N:通過(guò)旋轉(zhuǎn)堆棧將第N個(gè)目錄(從dirs打印的列表右側(cè)開(kāi)始,從零開(kāi)始計(jì)數(shù))到列表頂部
echo(process.cwd()); // 當(dāng)前文件父路徑 /Users... pushd("/etc") // /private/etc /Users... pushd("+1") // users... /private/etc
將當(dāng)前目錄保存在目錄堆棧的頂部,然后cd到dir。沒(méi)有參數(shù),pushd交換前兩個(gè)目錄。返回堆棧中的路徑數(shù)組。
popd([options,] [" - N"|"+ N"])
可用選項(xiàng):
-n:從堆棧中刪除目錄時(shí)禁止正常更改目錄,以便僅操作堆棧
參數(shù):
+N:刪除第N個(gè)目錄(從dirs打印的列表左側(cè)開(kāi)始計(jì)算),從零開(kāi)始
-N:刪除第N個(gè)目錄(從dirs打印的列表右側(cè)開(kāi)始計(jì)算),從零開(kāi)始。
echo(process.cwd()); // "/usr" pushd("/etc"); // "/etc /usr" echo(process.cwd()); // "/etc" popd(); // "/usr" echo(process.cwd()); // "/usr"
如果沒(méi)有給出參數(shù),popd將從堆棧中刪除頂級(jí)目錄并執(zhí)行cd到新的頂級(jí)目錄。從dirs列出的第一個(gè)目錄開(kāi)始,元素從0開(kāi)始編號(hào); 即,popd相當(dāng)于popd +0。返回堆棧中的路徑數(shù)組
dirs([options |"+ N"|"-N"]
可用選項(xiàng):
-c:通過(guò)刪除所有元素清除目錄堆棧
參數(shù):
+N:顯示第N個(gè)目錄(從沒(méi)有選項(xiàng)調(diào)用時(shí)由dirs打印的列表左側(cè)開(kāi)始計(jì)數(shù)),從零開(kāi)始
-N:顯示第N個(gè)目錄(從沒(méi)有選項(xiàng)調(diào)用時(shí)由dirs打印的列表右側(cè)開(kāi)始計(jì)數(shù)),從零開(kāi)始
顯示當(dāng)前記住的目錄列表。返回堆棧中的路徑數(shù)組,如果指定了+ N或-N,則返回單個(gè)路徑。
find(path [,path ...])
查找文件
console.log(find("../Config/application.js"))
返回path_array
grep([options,] regex_filter,file [,file ...])
不同于fing查找文件,grep用于查找內(nèi)容
可用選項(xiàng):
-v:反轉(zhuǎn)正則表達(dá)式的意義并打印不符合條件的行
-l:僅打印匹配文件的文件名
grep("-v", "GLOBAL_VARIABLE", "*.js"); grep("GLOBAL_VARIABLE", "*.js");
從給定文件中讀取輸入字符串,并返回一個(gè)字符串,其中包含 與給定文件匹配的文件的所有行regex_filter
head([{" - n":},] file [,file ...])
讀取文件的開(kāi)頭
可用選項(xiàng):
-n :顯示文件的第一行
console.log(head("bundle.js")) console.log(head({"-n":1},"bundle.js")) // 獲取第一行
tail([{" - n":},] file [,file ...])
讀取文件的結(jié)尾
可用選項(xiàng): -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)
創(chuàng)建鏈接
ln("file", "newlink"); // /Users.../newlink ln("-sf", "file", "newlink"); //如果newlink存在,則強(qiáng)制鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/6705.html
摘要:一場(chǎng)景在前端開(kāi)發(fā)過(guò)程中,你肯定經(jīng)常使用到以下等命令本人在用寫(xiě)我的個(gè)人博客時(shí),將其部署到上。每一次部署,都要將上面的命令敲一遍,實(shí)在令我很痛苦。安裝有兩種使用方式,一種是全局模式對(duì)應(yīng)全局安裝一種是局部模式。 一、場(chǎng)景 在前端開(kāi)發(fā)過(guò)程中,你肯定經(jīng)常使用到以下等命令: npm run build git add . git commit -m commit git push 本人在用vue...
摘要:本文主要是介紹開(kāi)發(fā)一個(gè)簡(jiǎn)單的腳手架,了解開(kāi)發(fā)的基本流程最終通過(guò)鏈接到全局包。完成之后,就可以把腳手架發(fā)布到上面,通過(guò)進(jìn)行全局安裝,就可以在自己本機(jī)上執(zhí)行來(lái)初始化項(xiàng)目,這樣便完成了一個(gè)簡(jiǎn)單的腳手架工具了。 腳手架,這個(gè)名詞對(duì)于作為前端的我們來(lái)說(shuō),也許并不陌生吧,像vue-cli,react-native-cli等,全局安裝后,只需要在命令行中敲入一個(gè)簡(jiǎn)單的命令,便可幫我們快速的生成一個(gè)初...
摘要:新建文件夾這是一個(gè)規(guī)范,可執(zhí)行工具的老家。然后輸入接下來(lái)會(huì)以問(wèn)答的形式向你了解你的用戶名密碼以及公開(kāi)的郵箱,之后輸入注意發(fā)布的源別是淘寶源,否則哦然后看到進(jìn)度條走,之后組件發(fā)布成功,可以到上搜索自己的包了。 如何用node開(kāi)發(fā)自己的cli工具 靈感 寫(xiě)這個(gè)工具的靈感以及場(chǎng)景源于youtube的一次閑聊 github 地址 blog首發(fā) showImg(https://segment...
摘要:新建文件夾這是一個(gè)規(guī)范,可執(zhí)行工具的老家。然后輸入接下來(lái)會(huì)以問(wèn)答的形式向你了解你的用戶名密碼以及公開(kāi)的郵箱,之后輸入注意發(fā)布的源別是淘寶源,否則哦然后看到進(jìn)度條走,之后組件發(fā)布成功,可以到上搜索自己的包了。 如何用node開(kāi)發(fā)自己的cli工具 靈感 寫(xiě)這個(gè)工具的靈感以及場(chǎng)景源于youtube的一次閑聊 github 地址 blog首發(fā) showImg(https://segment...
摘要:新建文件夾這是一個(gè)規(guī)范,可執(zhí)行工具的老家。然后輸入接下來(lái)會(huì)以問(wèn)答的形式向你了解你的用戶名密碼以及公開(kāi)的郵箱,之后輸入注意發(fā)布的源別是淘寶源,否則哦然后看到進(jìn)度條走,之后組件發(fā)布成功,可以到上搜索自己的包了。 如何用node開(kāi)發(fā)自己的cli工具 靈感 寫(xiě)這個(gè)工具的靈感以及場(chǎng)景源于youtube的一次閑聊 github 地址 blog首發(fā) showImg(https://segment...
閱讀 1392·2019-08-30 12:54
閱讀 1878·2019-08-30 11:16
閱讀 1621·2019-08-30 10:50
閱讀 2455·2019-08-29 16:17
閱讀 1275·2019-08-26 12:17
閱讀 1387·2019-08-26 10:15
閱讀 2396·2019-08-23 18:38
閱讀 792·2019-08-23 17:50