摘要:淺析筆者在此整理了常見(jiàn)的命令,的重要性無(wú)需多言,與其再百度海中搜索命令,不妨嘗試收藏筆者的此篇作品。旨在快速高效地處理無(wú)論規(guī)模大小的任何軟件工程。其最大特色就是分支及合并操作非常快速簡(jiǎn)便。
淺析git
筆者在此整理了常見(jiàn)的git命令,git的重要性無(wú)需多言,與其再百度海中搜索git命令,不妨嘗試收藏筆者的此篇作品。希望對(duì)你的學(xué)習(xí)有所幫助。
版本控制系統(tǒng)之git
Git:
(一)簡(jiǎn)介:
Git 是一款免費(fèi)的、開(kāi)源的、分布式的版本控制系統(tǒng)。旨在快速高效地處理無(wú)論規(guī)模大小的任何軟件工程。
每一個(gè) Git克隆 都是一個(gè)完整的文件庫(kù),含有全部歷史記錄和修訂追蹤能力,不依賴(lài)于網(wǎng)絡(luò)連接或中心服務(wù)器。其最大特色就是“分支”及“合并”操作非常快速、簡(jiǎn)便。
(二)Git與svn的主要區(qū)別:
Git是分布式SCM,而SVN是基于服務(wù)器的,也就是說(shuō)每個(gè)開(kāi)發(fā)者本地都有一套git庫(kù),每個(gè)人維護(hù)自己的版本(或者合并其他人的版本),而SVN是每個(gè)人寫(xiě)完代碼后都及時(shí)的checkin到服務(wù)器上,進(jìn)行合并。
Git的優(yōu)勢(shì):
說(shuō)到優(yōu)勢(shì),那么自然是相對(duì)與SVN而言的
1.版本庫(kù)本地化,支持離線提交,相對(duì)獨(dú)立不影響協(xié)同開(kāi)發(fā)。每個(gè)開(kāi)發(fā)者都擁有自己的版本控制庫(kù),在自己的版本庫(kù)上可以任意的執(zhí)行提交代碼、創(chuàng)建分支等行為。例如,開(kāi)發(fā)者認(rèn)為自己提交的代碼有問(wèn)題?沒(méi)關(guān)系,因?yàn)榘姹編?kù)是自己的,回滾歷史、反復(fù)提交、歸并分支并不會(huì)影響到其他開(kāi)發(fā)者。
2.更少的“倉(cāng)庫(kù)污染”。git對(duì)于每個(gè)工程只會(huì)產(chǎn)生一個(gè).git目錄,這個(gè)工程所有的版本控制信息都在這個(gè)目錄中,不會(huì)像SVN那樣在每個(gè)目錄下都產(chǎn)生.svn目錄。
3.把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ),完整克隆版本庫(kù)。所有版本信息位于.git目錄中,它是處于你的機(jī)器上的一個(gè)克隆版的版本庫(kù),它擁有中心版本庫(kù)上所有的東西,例如標(biāo)簽、分支、版本記錄等。
4.支持快速切換分支方便合并,比較合并性能好。在同一目錄下即可切換不同的分支,方便合并,且合并文件速度比SVN快。
5.分布式版本庫(kù),無(wú)單點(diǎn)故障,內(nèi)容完整性好。內(nèi)容存儲(chǔ)使用的是SHA-1哈希算法。這能確保代碼內(nèi)容的完整性,確保在遇到磁盤(pán)故障和網(wǎng)絡(luò)問(wèn)題時(shí)降低對(duì)版本庫(kù)的破壞。
本地創(chuàng)建git遠(yuǎn)程倉(cāng)庫(kù):
我這里使用的是:centos7.2、并且在服務(wù)器中已經(jīng)創(chuàng)建git賬戶(hù);如果沒(méi)有創(chuàng)建git賬戶(hù)的朋友,需要先創(chuàng)建git,并且在服務(wù)器端安裝git
1.在本地建立一個(gè)空白的git倉(cāng)庫(kù):
Git –bare init
注:--bare參數(shù)相當(dāng)與只創(chuàng)建一個(gè)空白的倉(cāng)庫(kù),只包含記錄版本庫(kù)歷史記錄的.git目錄下面的文件,不會(huì)包含實(shí)際項(xiàng)目源文件的拷貝;
2.將本地創(chuàng)建的倉(cāng)庫(kù)添加到遠(yuǎn)程服務(wù)器,使用的linux上傳命令;
Scp –r 文件夾 linux用戶(hù)名@ip:/文件目錄
如:scp –r gittest.git root@123.207.172.12:/data./git
(這里是將本地的gittest.git文件夾拷貝到服務(wù)器中 /data/git文件夾下)
3.此時(shí)可以直接將本地的gittest文件夾關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù),也可以在本地再次克隆git倉(cāng)庫(kù);使用命令如下:
Git clone git@123.207.172.15:/data/git/gittest.git
4.可以直接創(chuàng)建一個(gè)文件,進(jìn)行上傳測(cè)試;如:
cd gittest 進(jìn)入文件夾
vi app.js 然后隨便輸入字符,esc+wq!進(jìn)行保存退出;
然后將操作添加至?xí)捍鎱^(qū):
Git add .
創(chuàng)建本地倉(cāng)庫(kù)的版本:
Git commit –m “haha”
提交至遠(yuǎn)程服務(wù)器倉(cāng)庫(kù):
Git push origin master;
注:如果此時(shí)出現(xiàn)此種錯(cuò)誤:
remote: error: insufficient permission for adding an object to repository database ./objects
這時(shí)注意自己的服務(wù)器git賬戶(hù)是否有寫(xiě)的權(quán)限;一般是因?yàn)間it賬戶(hù)對(duì)gittest.git文件夾權(quán)限不夠;此時(shí)登陸自己的服務(wù)器,給git賬戶(hù)進(jìn)行權(quán)限的賦予;命令為:
Chown –R git:git /data/git/gittest.git
權(quán)限操作完畢后,再次進(jìn)行本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)的同步,一般此時(shí)不再會(huì)進(jìn)行報(bào)錯(cuò);
注:服務(wù)器git倉(cāng)庫(kù)的創(chuàng)建也可以直接在linux操作系統(tǒng)中進(jìn)行;
本地git創(chuàng)建倉(cāng)庫(kù)與github的遠(yuǎn)程倉(cāng)庫(kù)相關(guān)聯(lián):
1.首先登陸github官網(wǎng);進(jìn)行注冊(cè)、登錄
2.創(chuàng)建新的倉(cāng)庫(kù)
3.在本地創(chuàng)建git倉(cāng)庫(kù)
mkdir githubtest
git init
vi app.js
注:https協(xié)議和ssh協(xié)議的區(qū)別就是每次遠(yuǎn)程操作都需要輸入github的用戶(hù)名和密碼;
4.https協(xié)議:
Git remote add origin https://github.com/misterguan...
Git add .
Git commit –m “haha”
Git push –u origin master
此時(shí)需要輸入github的用戶(hù)名和密碼
此時(shí)會(huì)報(bào)錯(cuò): error: failed to push some refs to
(此種原因一般為在github的遠(yuǎn)程倉(cāng)庫(kù)有文件,在本地倉(cāng)庫(kù)沒(méi)有,所以此時(shí)應(yīng)該先將遠(yuǎn)程倉(cāng)庫(kù)合并到本地倉(cāng)庫(kù),再進(jìn)行提交)
git pull --rebase origin master
注意:這里的rebase和merge的區(qū)別,簡(jiǎn)單理解,rebase在log中無(wú)分叉,而merge有
再次提交,將會(huì)成功;
ssh協(xié)議:
首先需要?jiǎng)?chuàng)建密鑰
ssh-keygen –t rsa –C 837990335@qq.com
可以一路回車(chē);
(Enter file in which to save the key (/c/Users/dream/.ssh/id_rsa):
這里默認(rèn)就可以,這是存放ssh密鑰的路徑)
(Enter passphrase (empty for no passphrase):這里為ssh的密碼,可以為空)
然后到C:Users用戶(hù) .ssh中找到id_rsa.pub,然后復(fù)制里面的密鑰到github
例:C:Usersdream.ssh
在github的ssh and gpg keys中new ssh key
Title為此ssh的標(biāo)記
Key為你本地的密鑰
測(cè)試下:
ssh git@github.com
如果輸出You"ve successfully authenticated;說(shuō)明鏈接成功;
下面的操作跟https的一樣:
Git的分支管理:
查看本地分支:$ git branch
查看遠(yuǎn)程分支:$ git branch -r
創(chuàng)建本地分支:$ git branch [name] ----注意新分支創(chuàng)建后不會(huì)自動(dòng)切換為當(dāng)前分支
切換分支:$ git checkout [name]
創(chuàng)建新分支并立即切換到新分支:$ git checkout -b [name]
刪除分支:$ git branch -d [name] ---- -d選項(xiàng)只能刪除已經(jīng)參與了合并的分支,對(duì)于未有合并的分支是無(wú)法刪除的。如果想強(qiáng)制刪除一個(gè)分支,可以使用-D選項(xiàng)
合并分支:$ git merge [name] ----將名稱(chēng)為[name]的分支與當(dāng)前分支合并
創(chuàng)建遠(yuǎn)程分支(本地分支push到遠(yuǎn)程):$ git push origin [name]
刪除遠(yuǎn)程分支:$ git push origin :heads/[name]?或?$ gitpush origin :[name]?
項(xiàng)目開(kāi)發(fā)的分支:
Master:用于發(fā)布版本的分支;(用于大版本號(hào)更新時(shí)使用)
Dev:開(kāi)發(fā)時(shí)的主分支;
Feature:功能分支;(開(kāi)發(fā)某個(gè)局部分支,從dev分支上分出來(lái)的)
Release:創(chuàng)建一個(gè)預(yù)發(fā)布分支(從dev分支上分出來(lái),合并到master分支上,進(jìn)行tag標(biāo)注)
Bug:bug分支(從master分支上分出來(lái),修改完畢后合并到master和dev分支)
分支合并
在git進(jìn)行分支的合并時(shí)
如果使用默認(rèn)的fast-farward merge
直接修改當(dāng)前HEAD指針的指向然后再修改當(dāng)前HEAD指針,說(shuō)白了就是修改兩個(gè)指針的指向,而并沒(méi)有生成新的commit對(duì)象。
如果使用—no-ff 進(jìn)行合并
這樣會(huì)在master分支上創(chuàng)建一個(gè)版本;
git如何解決代碼沖突:
1.邏輯沖突
git自動(dòng)處理(合并/應(yīng)用補(bǔ)丁)成功,但是邏輯上是有問(wèn)題的。
比如另外一個(gè)人修改了文件名,但我還使用老的文件名,這種情況下自動(dòng)處理是能成功的,但實(shí)際上是有問(wèn)題的。
又比如,函數(shù)返回值含義變化,但我還使用老的含義,這種情況自動(dòng)處理成功,但可能隱藏著重大BUG。這種問(wèn)題,主要通過(guò)自動(dòng)化測(cè)試來(lái)保障。所以最好是能夠?qū)懗霰容^完備的自動(dòng)化測(cè)試用例。
這種沖突的解決,就是做一次BUG修正。不是真正解決git報(bào)告的沖突。
2.內(nèi)容沖突
兩個(gè)用戶(hù)修改了同一個(gè)文件的同一塊區(qū)域,git會(huì)報(bào)告內(nèi)容沖突。我們常見(jiàn)的都是這種,后面的解決辦法也主要針對(duì)這種沖突。如圖中是:app.js沖突:
然后手動(dòng)修改沖突的文件:
再次進(jìn)行文件的提交,版本的創(chuàng)建;
3.樹(shù)沖突
文件名修改造成的沖突,稱(chēng)為樹(shù)沖突。
比如,a用戶(hù)把a(bǔ)pp.js改名為master.js,b用戶(hù)把a(bǔ)pp.js文件改名為test.js,那么b將這兩個(gè)commit合并時(shí),會(huì)產(chǎn)生沖突。
此時(shí)打開(kāi)文件,把需要的刪除的文件刪除掉即可,如把master.js刪除掉;
然后,再次重新創(chuàng)建版本即可:
git常用操作命令:
1.查看、添加、提交、刪除、找回,重置修改文件
git help
git show # 顯示某次提交的內(nèi)容 git show $id
git co --
git co . # 拋棄工作區(qū)修改
git add
git add . # 將所有修改過(guò)的工作文件提交暫存區(qū)
git rm
git rm
git reset
git reset -- . # 從暫存區(qū)恢復(fù)到工作文件
git reset --hard # 恢復(fù)最近一次提交過(guò)的狀態(tài),即放棄上次提交后的所有本次修改
git ci
git ci --amend # 修改最后一次提交記錄
git revert <$id> # 恢復(fù)某次提交的狀態(tài),恢復(fù)動(dòng)作本身也創(chuàng)建次提交對(duì)象
git revert HEAD # 恢復(fù)最后一次提交的狀態(tài)
2.查看文件diff
git diff
git diff
git diff
git diff --staged # 比較暫存區(qū)和版本庫(kù)差異
git diff --cached # 比較暫存區(qū)和版本庫(kù)差異
git diff --stat # 僅僅比較統(tǒng)計(jì)信息
3.查看提交記錄
git log git log
git log -p
git log -p -2 # 查看最近兩次詳細(xì)修改內(nèi)容的diff
git log --stat #查看提交統(tǒng)計(jì)信息
tig
Mac上可以使用tig代替diff和log,brew install tig
4.查看、切換、創(chuàng)建和刪除分支
git br -r # 查看遠(yuǎn)程分支
git br
git br -v # 查看各個(gè)分支最后提交信息
git br --merged # 查看已經(jīng)被合并到當(dāng)前分支的分支
git br --no-merged # 查看尚未被合并到當(dāng)前分支的分支
git co
git co -b
git co -b
git co $id # 把某次歷史提交記錄checkout出來(lái),但無(wú)分支信息,切換到其他分支會(huì)自動(dòng)刪除
git co $id -b
git br -d
git br -D
5.?分支合并和rebase
git merge
git merge origin/master --no-ff # 不要Fast-Foward合并,這樣可以生成merge提交
git rebase master
6.?Git補(bǔ)丁管理(方便在多臺(tái)機(jī)器上開(kāi)發(fā)同步時(shí)用)
git diff > ../sync.patch # 生成補(bǔ)丁
git apply ../sync.patch # 打補(bǔ)丁
git apply --check ../sync.patch #測(cè)試補(bǔ)丁能否成功
7.?Git暫存管理
git stash # 暫存
git stash list # 列所有stash
git stash apply # 恢復(fù)暫存的內(nèi)容
git stash drop # 刪除暫存區(qū)
8.Git遠(yuǎn)程分支管理
git pull # 抓取遠(yuǎn)程倉(cāng)庫(kù)所有分支更新并合并到本地
git pull --no-ff # 抓取遠(yuǎn)程倉(cāng)庫(kù)所有分支更新并合并到本地,不要快進(jìn)合并
git fetch origin # 抓取遠(yuǎn)程倉(cāng)庫(kù)更新
git merge origin/master # 將遠(yuǎn)程主分支合并到本地當(dāng)前分支
git co --track origin/branch # 跟蹤某個(gè)遠(yuǎn)程分支創(chuàng)建相應(yīng)的本地分支
git co -b
git push # push所有分支
git push origin master # 將本地主分支推到遠(yuǎn)程主分支
git push -u origin master # 將本地主分支推到遠(yuǎn)程(如無(wú)遠(yuǎn)程主分支則創(chuàng)建,用于初始化遠(yuǎn)程倉(cāng)庫(kù))
git push origin
git push origin
git push origin :
9.Git遠(yuǎn)程倉(cāng)庫(kù)管理
GitHub
git remote -v # 查看遠(yuǎn)程服務(wù)器地址和倉(cāng)庫(kù)名稱(chēng)
git remote show origin # 查看遠(yuǎn)程服務(wù)器倉(cāng)庫(kù)狀態(tài)
git remote add origin git@ github:robbin/robbin_site.git # 添加遠(yuǎn)程倉(cāng)庫(kù)地址
git remote set-url origin git@ github.com:robbin/robbin_site.git # 設(shè)置遠(yuǎn)程倉(cāng)庫(kù)地址(用于修改遠(yuǎn)程倉(cāng)庫(kù)地址) git remote rm
10.創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)
git clone --bare robbin_site robbin_site.git # 用帶版本的項(xiàng)目創(chuàng)建純版本倉(cāng)庫(kù)
scp -r my_project.git git@ git.csdn.net:~ # 將純倉(cāng)庫(kù)上傳到服務(wù)器上
mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服務(wù)器創(chuàng)建純倉(cāng)庫(kù)
git remote add origin git@ github.com:robbin/robbin_site.git # 設(shè)置遠(yuǎn)程倉(cāng)庫(kù)地址
git push -u origin master # 客戶(hù)端首次提交
git push -u origin develop # 首次將本地develop分支提交到遠(yuǎn)程develop分支,并且track
git remote set-head origin master # 設(shè)置遠(yuǎn)程倉(cāng)庫(kù)的HEAD指向master分支
也可以命令設(shè)置跟蹤遠(yuǎn)程庫(kù)和本地庫(kù)
git branch --set-upstream master origin/master
git branch --set-upstream develop origin/develop
項(xiàng)目自動(dòng)化:
現(xiàn)在的前端開(kāi)發(fā)已經(jīng)不再僅僅只是靜態(tài)網(wǎng)頁(yè)的開(kāi)發(fā)了,日新月異的前端技術(shù)已經(jīng)讓前端代碼的邏輯和交互效果越來(lái)越復(fù)雜,更加的不易于管理,模塊化開(kāi)發(fā)和預(yù)處理框架把項(xiàng)目分成若干個(gè)小模塊,增加了最后發(fā)布的困難,沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn),讓前端的項(xiàng)目結(jié)構(gòu)千奇百怪。前端自動(dòng)化構(gòu)建在整個(gè)項(xiàng)目開(kāi)發(fā)中越來(lái)越重要。
(一)工具化
在前端的技術(shù)棧發(fā)展過(guò)程中,出現(xiàn)了很多的工具,形成了工具化,能夠用工具完成的絕不要手工完成,來(lái)幫助開(kāi)發(fā)者提升效率。
前端工作流工具: Gulp,Grunt
前端js模塊編譯工具:Babel,Browserify,Webpack
包管理器: npm,bower
前端開(kāi)發(fā)系列工具: livereload,數(shù)據(jù)mock,代碼監(jiān)控,代碼檢查。
(二)工程化
工程化是一個(gè)發(fā)展趨勢(shì),以工具化為基礎(chǔ)。
工程的核心是流程自動(dòng)化,又稱(chēng)為構(gòu)建,這些包括了:代碼質(zhì)量檢測(cè),代碼壓縮,代碼合并,代碼優(yōu)化,代碼編譯,單元測(cè)試等等部分。構(gòu)建就是把這些以工作流程的方式組合起來(lái),然后用一個(gè)命令行運(yùn)行這整個(gè)流程。它有點(diǎn)像批處理,但是是程序開(kāi)發(fā)中使用的特殊批處理。
(三)自動(dòng)化
自動(dòng)化是以工程化為基礎(chǔ),是在流程自動(dòng)化上更進(jìn)一步的自動(dòng)化。
持續(xù)集成就是全自動(dòng)化的一個(gè)終極體現(xiàn)。他的主要流程是:版本控制庫(kù) ->構(gòu)建 ->測(cè)試 ->報(bào)告.
(四)代碼規(guī)范
代碼規(guī)范可以提高代碼的可閱讀性和避免一些低級(jí)錯(cuò)誤。為了將代碼規(guī)范的檢查放到前端開(kāi)發(fā)工程中,各種前端語(yǔ)言都有對(duì)應(yīng)的hint或者lint工具。
(五)預(yù)處理
SASS
甚至為了避免這一點(diǎn),引入了各種預(yù)編譯語(yǔ)言,css的預(yù)編譯less,現(xiàn)在流行的是sass,功能也更加強(qiáng)大,語(yǔ)法錯(cuò)誤無(wú)法通過(guò)編譯,來(lái)彌補(bǔ)css這種缺陷。
(六)ES6
js的預(yù)處理語(yǔ)言也有很多,只是為了讓有其他語(yǔ)言經(jīng)驗(yàn)的開(kāi)發(fā)者更容易的上手js的編碼。
因?yàn)闉g覽器的實(shí)現(xiàn)大多還是 ES5 的標(biāo)準(zhǔn),為了使用最新的 ES6 語(yǔ)法,通常的做法是采用 Babel 將 ES6 編譯為 ES5。
(七)js模塊化
amd,cmd,common,es6
(八)文件處理
通常一個(gè)前端項(xiàng)目會(huì)分有一個(gè) src 目錄和 dist 目錄, src 放置源碼,dist 放置編譯后的代碼。所以在前端工程的流程中會(huì)涉及到文件的拷貝,刪除,移動(dòng)等流程。
(九)開(kāi)發(fā)效率
通常的前端開(kāi)發(fā)過(guò)程是,修改前端代碼,調(diào)用命令編譯代碼,然后瀏覽器 F5 刷新。這個(gè)過(guò)程可以做到自動(dòng)化,通過(guò)代碼監(jiān)控工具,指定要監(jiān)控的目錄和文件,如果對(duì)應(yīng)文件有改變,調(diào)用編譯工具編譯源碼,然后通過(guò) livereload 自動(dòng)刷新瀏覽器。 gulp-browserify也可以實(shí)現(xiàn)同樣的功能。
(十)數(shù)據(jù)的mock
現(xiàn)代化前端項(xiàng)目開(kāi)發(fā)大多是前后端分離的方式,也就是后端基本是提供 API 服務(wù),在真實(shí)開(kāi)發(fā)環(huán)境中,通常的問(wèn)題是,后端 API 極其不穩(wěn)定或者沒(méi)開(kāi)發(fā),為了不阻礙前端的開(kāi)發(fā),通常的做法是,前后端先約定 API 接口定義,然后前端根據(jù)定義 mock 接口。
(十一)前端工作流
為了解決前端工程中復(fù)雜的流程,出現(xiàn)了很多開(kāi)源前端流程處理工具。這些工作流工具不僅僅是其本身,都是一個(gè)流程生態(tài)體系,每個(gè)工具都涉及到對(duì)應(yīng)的插件庫(kù),幾乎我們能想到的前端工程問(wèn)題都有對(duì)用的插件能夠解決。
Gulp:
Gulp 是基于node.js的一個(gè)前端自動(dòng)化構(gòu)建工具,開(kāi)發(fā)這可以使用它構(gòu)建自動(dòng)化工作流程(前端集成開(kāi)發(fā)環(huán)境)。?
使用gulp你可以簡(jiǎn)化工作量,讓你把重點(diǎn)放在功能的開(kāi)發(fā)上,從而提高你的開(kāi)發(fā)效率和工作質(zhì)量。?gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比,gulpjs無(wú)需寫(xiě)一大堆繁雜的配置參數(shù),API也非常簡(jiǎn)單,學(xué)習(xí)起來(lái)很容易,而且gulpjs使用的是nodejs中stream來(lái)讀取和操作數(shù)據(jù),其速度更快
(一)安裝:
需要在全局或者項(xiàng)目中同時(shí)安裝;
Cnpm install -g gulp
Cnpm install –save-dev gulp
(二)配置文件
使用gulpfile.js進(jìn)行配置,基于gulp工作流的項(xiàng)目結(jié)構(gòu)如下:
(三)Api:
1.gulp.src(globs[, options]) 輸出(Emits)符合所提供的匹配模式(glob)或者匹配模式的數(shù)組(array of globs)的文件。 將返回一個(gè)?Vinyl files?的?stream?它可以被?piped?到別的插件中。文件的入口
A.路徑匹配:
1)*? :能匹配?a.js,x.y,abc,abc/,但不能匹配a/b.js
2).? :能匹配?a.js,style.css,a.b,x.y
3)//*.js? :能匹配?a/b/c.js,x/y/z.js,不能匹配a/b.js,a/b/c/d.js
4)**?能匹配 :?abc,a/b.js,a/b/c.js,x/y/z,x/y/z/a.b,能用來(lái)匹配所有的目錄和文件
5)*/.js? :能匹配?foo.js,a/foo.js,a/b/foo.js,a/b/c/foo.js
6)a/**/z? :能匹配?a/z,a/b/z,a/b/c/z,a/d/g/h/j/k/z
7)a/b/z? :能匹配?a/b/z,a/sb/z,但不能匹配a/x/sb/z,因?yàn)橹挥袉?/strong>多帶帶出現(xiàn)才能匹配多級(jí)目錄
8)?.js? :能匹配?a.js,b.js,c.js
9)a??? :能匹配?a.b,abc,但不能匹配ab/,因?yàn)樗粫?huì)匹配路徑分隔符
10)[xyz].js? :只能匹配?x.js,y.js,z.js,不會(huì)匹配xy.js,xyz.js等,整個(gè)中括號(hào)只代表一個(gè)字符
11)1.js? :能匹配?a.js,b.js,c.js等,不能匹配x.js,y.js,z.js
B.匹配多種文件
//使用數(shù)組的方式來(lái)匹配多種文件
gulp.src(["js/.js","css/.css","*.html"])
2.gulp.dest(path[, options]) 能被 pipe 進(jìn)來(lái),并且將會(huì)寫(xiě)文件。并且重新輸出(emits)所有數(shù)據(jù),因此你可以將它 pipe 到多個(gè)文件夾。如果某文件夾不存在,將會(huì)自動(dòng)創(chuàng)建它。輸出文件
根路徑:如果在src中不設(shè)置base時(shí),所有的默認(rèn)根路徑,都是從出現(xiàn)匹配符的地方開(kāi)始截取:
如:
gulp.src("app/src/*/.css") //此時(shí)base的值為app/src,也就是說(shuō)它的base路徑為app/src
//設(shè)該模式匹配到了文件 app/src/css/normal.css .pipe(gulp.dest("dist")) //用dist替換掉base路徑,最終得到 dist/css/normal.css
如果增加base基路徑:
gulp.src(script/lib/*.js, {base:"script"}) //配置了base參數(shù),此時(shí)base路徑為script //假設(shè)匹配到的文件為script/lib/jquery.js .pipe(gulp.dest("build")) //此時(shí)生成的文件路徑為 build/lib/jquery.js
3.gulp.task(name[, deps], fn) 定義一個(gè)使用?Orchestrator?實(shí)現(xiàn)的任務(wù)(task)。
1)參數(shù):
Name:任務(wù)的名字,如果你需要在命令行中運(yùn)行你的某些任務(wù),那么,請(qǐng)不要在名字中使用空格。
Deps:類(lèi)型:?Array,一個(gè)包含任務(wù)列表的數(shù)組,這些任務(wù)會(huì)在你當(dāng)前任務(wù)運(yùn)行之前完成。
Fn:該函數(shù)定義任務(wù)所要執(zhí)行的一些操作。
2)異步任務(wù)
A.使用callback:
var gulp = require("gulp");
// 返回一個(gè) callback,因此系統(tǒng)可以知道它什么時(shí)候完成
gulp.task("one", function(cb) {
// 做一些事 -- 異步的或者其他的 cb(err); // 如果 err 不是 null 或 undefined,則會(huì)停止執(zhí)行,且注意,這樣代表執(zhí)行失敗了
});
// 定義一個(gè)所依賴(lài)的 task 必須在這個(gè) task 執(zhí)行之前完成
gulp.task("two", ["one"], function() {
// "one" 完成后
});
gulp.task("default", ["two"]);
B.使用promise
var gulp = require("gulp");
// 返回一個(gè) callback,因此系統(tǒng)可以知道它什么時(shí)候完成
gulp.task("one", function(cb) {
// 做一些事 -- 異步的或者其他的 return new Promise((res, rej) => { setTimeout(() => { res(1344) }, 5000) })
});
// 定義一個(gè)所依賴(lài)的 task 必須在這個(gè) task 執(zhí)行之前完成
gulp.task("two", ["one"], function() {
// "one" 完成后 console.log("two開(kāi)始")
});
gulp.task("default", ["two"]);
注意:5s后才開(kāi)始執(zhí)行的two任務(wù)
3)對(duì)于同步任務(wù):
gulp.task("one",function(cb){ var stream = gulp.src("client/**/*.js") .pipe(dosomething()) //dosomething()中有某些異步操作 .pipe(gulp.dest("build")); return stream; }); gulp.task("two",["one"],function(){ console.log("two is done"); });
4.gulp.watch(glob[, opts], tasks)監(jiān)視文件,并且可以在文件發(fā)生改動(dòng)時(shí)做一些事情;
1)監(jiān)聽(tīng)文件改變,并執(zhí)行相應(yīng)的task任務(wù)
var watcher = gulp.watch("js/*/.js", ["uglify", "reload"]);
watcher.on("change", function(event) {
console.log("File " + event.path + " was " + event.type + ", running tasks...");
});
2)監(jiān)聽(tīng)文件改變,并執(zhí)行回調(diào)函數(shù)
gulp.watch("js/*/.js", function(event) {
console.log("File " + event.path + " was " + event.type + ", running tasks...");
});
(四)第三方插件:
1.gulp-load-plugins:用來(lái)加載插件,避免我們?cè)兕^部聲明一堆插件,做到想用就用
2.less:用于編譯 .less文件
3.autoprefixer:自動(dòng)添加css前綴
4.babel:es6 編譯成 es5
5.uglify:JS壓縮
6.minify:CSS壓縮
7.rename:重命名
8.sourcemaps:資源映射
9.concat:合并文件
10.del:刪除文件、文件夾
11.inject:文件注入
12.notify:提示信息
13.browser-sync:熱啟動(dòng)
14.http-proxy-middleware:配合browser-sync進(jìn)行跨域
15.changed:只有發(fā)生了改變的文件才能進(jìn)入流中
16.sequence:讓task按順序完成
17.rev:添加MD5
18.watch:監(jiān)聽(tīng)文件變化
(五)實(shí)現(xiàn)項(xiàng)目自動(dòng)化構(gòu)建:
使用gulp構(gòu)建項(xiàng)目,項(xiàng)目中支持:
1)js的模塊化(可以實(shí)現(xiàn)模塊化(common與require的切換));
2)sass的編譯;
3)jslint的代碼校驗(yàn);
4)劃分本地啟動(dòng)配置和線上打包配置;
5)實(shí)現(xiàn)文件的md5加密;
6)實(shí)現(xiàn)本地的開(kāi)發(fā)服務(wù);
7)實(shí)現(xiàn)mock數(shù)據(jù)
8)實(shí)現(xiàn)本地實(shí)時(shí)刷新
本篇文章內(nèi)容還未補(bǔ)全,之后會(huì)做更多修改,以期待完成補(bǔ)全,不過(guò)對(duì)于初學(xué)git以及node的同學(xué)來(lái)說(shuō)已然是夠用了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/114117.html
摘要:打開(kāi)是個(gè)構(gòu)造函數(shù),定義了一些靜態(tài)屬性和方法我們先看在插件下地址上面寫(xiě)的解釋就跟沒(méi)寫(xiě)一樣在文件下我們看到輸出的一些對(duì)象方法每一個(gè)對(duì)應(yīng)一個(gè)模塊而在下引入的下面,我們先研究引入的對(duì)象的英文單詞解釋?zhuān)俗畛S玫狞c(diǎn)擊手勢(shì)之外,還有一個(gè)意思是水龍頭進(jìn) 打開(kāi)compile class Compiler extends Tapable { constructor(context) { ...
摘要:淺析筆者在此整理了常見(jiàn)的命令,的重要性無(wú)需多言,與其再百度海中搜索命令,不妨嘗試收藏筆者的此篇作品。旨在快速高效地處理無(wú)論規(guī)模大小的任何軟件工程。其最大特色就是分支及合并操作非常快速簡(jiǎn)便。 淺析git 筆者在此整理了常見(jiàn)的git命令,git的重要性無(wú)需多言,與其再百度海中搜索git命令,不妨嘗試收藏筆者的此篇作品。希望對(duì)你的學(xué)習(xí)有所幫助。 版本控制系統(tǒng)之git Git: (一)簡(jiǎn)介:G...
摘要:淺析筆者在此整理了常見(jiàn)的命令,的重要性無(wú)需多言,與其再百度海中搜索命令,不妨嘗試收藏筆者的此篇作品。旨在快速高效地處理無(wú)論規(guī)模大小的任何軟件工程。其最大特色就是分支及合并操作非常快速簡(jiǎn)便。 淺析git 筆者在此整理了常見(jiàn)的git命令,git的重要性無(wú)需多言,與其再百度海中搜索git命令,不妨嘗試收藏筆者的此篇作品。希望對(duì)你的學(xué)習(xí)有所幫助。 版本控制系統(tǒng)之git Git: (一)簡(jiǎn)介:G...
摘要:淺析參數(shù)說(shuō)明對(duì)于所有列表里提到的純模塊做處理需要在腳本里有一個(gè)包名到目錄的映射。闡明包名到目錄的映射,見(jiàn)鍵代表了包的名字,空的包名則代表不在任何包中的頂層包。最終會(huì)在下生成可執(zhí)行文件,調(diào)用制定的函數(shù)實(shí)例分析 python setup.py 淺析 setuptools.setup() 參數(shù)說(shuō)明 packages 對(duì)于所有 packages 列表里提到的純 Python 模塊做處理 需要...
閱讀 3480·2021-10-13 09:39
閱讀 1462·2021-10-08 10:05
閱讀 2265·2021-09-26 09:56
閱讀 2283·2021-09-03 10:28
閱讀 2681·2019-08-29 18:37
閱讀 2039·2019-08-29 17:07
閱讀 606·2019-08-29 16:23
閱讀 2198·2019-08-29 11:24