作者 | 弗拉德
來源 | 弗拉德(公眾號:fulade_me)
什么是Pub工具
Dart 生態(tài)系統(tǒng)使用包來管理共享軟件,比如:庫和工具。我們使用Pub包管理工具 來獲取Dart包。在Pub上,可以找到公開可用的包?;蛘邚谋镜匚募到y(tǒng)或其他的位置,比如Git倉庫,加載可用的包。無論包是從什么途徑加載的, Pub 都會進行版本依賴管理,從而幫助我們獲得版本兼容的軟件包以及SDK。
pub工具包含管理 Package 、部署 Package 和部署命令行應用的命令。
Dart 包目錄中至少包含一個pubspec文件。

pubspec 文件記錄一些關(guān)于項目的依賴數(shù)據(jù)。此外還有一些其他數(shù)據(jù)比如:Dart 庫,應用,資源,測試,圖片,以及示例。
下面是一個 pubspec 的示例,示例中聲明依賴了在 Pub 站點上托管的兩個包( js 和 intl ):
name: my_app
dependencies:
js: ^0.6.0
intl: ^0.15.8
pub get
在項目中配置了pubspec文件后,就可以在項目根目錄中執(zhí)行pub get命令:
cd <path-to-my_app>
pub get
pub get命令確定當前應用所依賴的包,并將它們保存到中央系統(tǒng)緩存(central system cache)中。如果當前應用依賴了一個公開包,Pub會從Pub站點 該包。對于一個Git依賴,Pub會Clone該Git倉庫。
同樣包括包的相關(guān)依賴也會被下載。例如,如果 js 包依賴 test 包, pub 會同時獲取js包和test包。
Pub 會創(chuàng)建一個.packages 文件(位于應用程序的根路目錄下),該文件將應用程序所依賴的每個包名相應的映射到系統(tǒng)緩存中的包。

pub upgrade
第一次獲取依賴時,Pub 會下載依賴及其兼容的最新版本。然后通過創(chuàng)建lockfile 鎖定依賴,以始終使用這個版本。 Pub會在pubspec旁創(chuàng)建并存儲一個名為pubspec.lock文件。它列出了使用的每個依賴包的指定版本(當前包或傳遞包的版本)。

在開發(fā)項目中的每個人都能夠使用所有相同版本的包。同樣加入到 lockfile 可以保證部署的應用使用的是同一版本的代碼。
如果已經(jīng)準備更新依賴到最新版本,使用命令 pub upgrade :
pub upgrade
上面的命令用于重新生成 lockfile 文件,并使用最新可用版本的依賴包。如果僅升級某個依賴,可以在命令中指定需要升級的包:
pub upgrade intl
上面的命令升級intl到最新版本,其它包不變。
注意pub upgrade 命令并非總是可以將所有的package更新到最新版本,原因是pubspec文件中的一些package之間有版本限制的沖突。
pub cache
用于管理 Pub 的本地 Package 緩存。使用該命令你可以將一個 Package 添加至緩存,或者清除所有緩存的 Package 并重新安裝。
你可以使用pub cache add命令將新的 Package 添加至緩存。也可以使用pub cache repair 命令將Package從緩存中清除并重新安裝。
pub cache add <package> [--version <constraint>] [--all]
pub cache repair
選項
add <package> # 在你的緩存中安裝一個庫。
--all # 可選的選項。與 pub add 結(jié)合使用用于安裝某個庫的所有版本。
--version <constraint> # 可選的選項。與 pub add 結(jié)合使用根據(jù)限制條件安裝最適合的版本。
# 例如:pub cache add barback --version "<=0.8.0 <0.110" 如果省略掉 --version,Pub 會從已知的版本中挑選一個最適合的進行安裝。
repair # 如果 Pub 緩存中的 Package 被修改壞了的。例如,有人不小心修改了依賴內(nèi)的文件,但是不知道該如何修改回來。pub cache repair 命令可以對系統(tǒng)緩存中的所有 Package 執(zhí)行重安裝以修正篡改的問題。
pub deps
該命令可以將 Package 的依賴圖示打印輸出到控制臺。該圖示中包括 Package 聲明在 pubspec 文件中的直接依賴以及這些直接依賴所依賴的間接依賴。
pub deps [--style=<style>] [--dev] [--no-dev] [--executables]
依賴信息默認以樹狀的形式打印輸出。
例如,有個項目的pubspec文件中聲明了如下依賴信息:
dependencies:
barback: ^0.15.2
markdown: ^0.7.2
當你執(zhí)行 pub deps 命令時則會看到項目的依賴圖示如下:
markdown_converter 0.0.0
|-- barback 0.15.2+6
| |-- collection 1.1.2
| |-- path 1.3.6
| |-- pool 1.1.0
| | '-- stack_trace...
| |-- source_span 1.2.0
| | '-- path...
| '-- stack_trace 1.4.2
| '-- path...
'-- markdown 0.7.2
選項
--style=<style> 或 -s <style> ## 指定的樣式輸出格式。用于指定依賴項打印輸出的樣式。
# 共有 簡潔、樹狀 和 列表 三種,默認是樹狀樣式。
# tree 以樹狀的形式打印依賴信息。這是默認格式。
# list 以列表的形式打印依賴信息。
# compact 以緊湊列表的形式打印依賴信息。
--dev # 打印所有包依賴信息,包括開發(fā)時期依賴。它是默認選項。
--no-dev #打印除了開發(fā)期依賴之外的所有包依賴。
--executables #打印所有可用的可執(zhí)行文件。
pub downgrade
在沒有其它額外參數(shù)的情況下,pub downgrade命令會獲取當前工作目錄下 pubspec.yaml 文件中列出的所有依賴項以及它們間接依賴項的最低版本。
pub downgrade [--[no-]offline] [-n|--dry-run] [dependencies...]
例如:
$ pub downgrade
Resolving dependencies... (1.2s)
+ barback 0.13.0
+ collection 0.9.1
+ path 1.2.0
+ source_maps 0.9.0
+ source_span 1.0.0
+ stack_trace 0.9.1
Changed 6 dependencies!
pub downgrade 命令會創(chuàng)建一個lockfile文件。如果lockfile文件已經(jīng)存在,Pub 則會忽略該文件并生成一個新的lockfile 文件,然后所有依賴項都會使用最低版本。
降級指定依賴項
你可以指定pub downgrade命令只將某個依賴項的版本降至最低且不影響其余依賴項。例如:
$ pub downgrade test
Resolving dependencies...
barback 0.15.2+2
bot 0.27.0+2
browser 0.10.0+2
chrome 0.6.5
collection 1.1.0
path 1.3.0
pool 1.0.1
source_span 1.0.2
< stack_trace 0.9.2 (was 1.1.1)
stagexl 0.10.2
< test 0.10.0 (was 0.11.4)
These packages are no longer being depended on:
- matcher 0.11.3
Changed 3 dependencies!
如果你降低指定依賴項的版本,且該依賴項還有間接依賴項,那么在版本變更后這些間接依賴項可能不適配降低后的新版依賴項。此時,Pub 會嘗試在新版本依賴項可接受的范圍內(nèi)查找版本最高的該依賴項所依賴的間接依賴項。因此,通常而言,降低某個依賴項的版本后,其間接依賴項的版本也會隨之降低。
獲取新的依賴項
如果在執(zhí)行pub downgrade命令前將某個依賴添加至 pubspec 文件中,則在執(zhí)行該命令后會將該新的依賴項以及其間接依賴的其它依賴項下載并將其放到 .packages 文件中。這點與 pub get 命令一致。
移除依賴項
如果在 pub downgrade 命令前從 pubspec 文件移除了某個依賴項,則在執(zhí)行該命令后會將該依賴項從 .packages 文件中移除,且代碼使用到該依賴項的相關(guān)導入將變得不可用。所有該依賴項依賴的間接依賴項也同時會被移除,只要這些間接依賴項沒有沒其它的依賴項所依賴。這點也與pub get 命令一致。
離線降級
在沒有網(wǎng)絡(luò)的情況下你也依然可以運行pub downgrade 命令。因為 Pub 會將 Package 下載到一個統(tǒng)一的緩存區(qū)并將其與系統(tǒng)上其它的 Package 進行共享,如果你所需的 Package 是一個使用頻率很高的 Package,那么很有可能它已經(jīng)被其它 Package 在使用時下載到統(tǒng)一緩存區(qū)中了,此時你可以直接依賴使用它。
但是,默認情況下,pub downgrade 命令會總是嘗試獲取線上的依賴版本,因此 Pub 可以確定依賴項是否有更新的版本。如果你不想 Pub 去線上檢查,可以使用 --offline 命令參數(shù)讓該命令在離線模式下執(zhí)行。在離線模式下,Pub 只會從本地緩存區(qū)查找已經(jīng)下載到的可用 Package。
選項
--[no-]offline # 默認情況下,pub 將會通過網(wǎng)絡(luò)檢查(--no-offline)。要使用緩存的包,請使用 --offline。
--dry-run 或 -n #報告將要改變的依賴項,但不會真的改變它。
pub publish
pub publish [--dry-run] [--force]
該命令用于將你的 Package 發(fā)布到pub.dev網(wǎng)站以供其他人下載和依賴。
選項
--dry-run 或 -n #該選項可以讓你運行上傳 Package 的整個流程但不會真正地上傳任何文件到 pub.dev 網(wǎng)站。此操作可以讓你在真正上傳到 pub.dev 網(wǎng)站前檢查你的上傳等相關(guān)配置是否有誤。
--force 或 -f #該選項讓 Pub 在上傳時不再向你進行確認。正常情況下,它會在你上傳時向你顯示 Package 的內(nèi)容以及向你進行確認。
如果 Package 存在錯誤,Pub 則會退出且不繼續(xù)進行上傳。如果出現(xiàn)的是警告,則 Package 會依舊被上傳。如果你想確保你的 Package 在上傳前沒有警告,請確保不要使用 --force 和 --dry-run 選項。
pub uploader
pub uploader [options] {add/remove} <email>
該命令允許pub.dev網(wǎng)站上某個 Package的上傳者為該Package添加或刪除其它的上傳者。其有兩個子命令add和remove,可以將郵件地址作為某個上傳者的標識以此來添加或刪除上傳者。例如:
pub uploader add bob@example.com # 我們已經(jīng)向 bob@example.com 發(fā)送了一份邀請函,在他/她確認后就會成被加入上傳者(權(quán)限)
pub uploader remove bob@example.com # // 成功將該上傳者從 package 中移除
如果 Package 有且只有一個上傳者,則該上傳者不能再被刪除。你可以將自己從上傳者列表中刪除(只要 Package 中還有其它的上傳者即可),但是一旦你刪除了自己后則不能再將自己添加回去。
默認情況下,你修改的是當前工作目錄中 Package 的上傳者。你可以通過 --package 標識來指定修改哪個 Package 的上傳者。例如:
pub uploader --package=transmogrify add bob@example.com
# // 我們已經(jīng)向 bob@example.com 發(fā)送了一份邀請函,在他/她確認后就會成被加入上傳者(權(quán)限)
通過 pub uploader add <email> 命令發(fā)送邀請,被邀請的用戶必須接受。
其他不常用的命令可參考:
pub outdated 使用方法參考:https://zhuanlan.zhihu.com/p/138638020
pub global 使用方法參考:http://www.itdecent.cn/p/8a7f2cbac7a1