cargo-offline
命令
cargo-offline
是標準cargo
命令的包裝器。其被用來,根據·距離cargo-offline
命令執行目錄最近的Cargo.toml
文件是否被修改過,來給被包裝的cargo
命令條件地增補--offline
命令行參數(即,離線編譯)。形象地講,就是將cargo check
條件地變形為cargo check --offline
。
-
項目鏈接:https://github.com/stuartZhang/cargo-offline
-
包倉庫鏈接:https://crates.io/crates/cargo-offline
-
代碼也精彩,真不是簡單的代碼堆疊,而是有套路,和講套路的。
-
先點個
star
-
再直接導航至:https://github1s.com/stuartZhang/cargo-offline
-
動機
最近一段時間,github.com訪問的穩定性實在很差。但,執行cargo
命令總是要求
-
首先,同步crates.io-index索引清單。
-
然后,執行目標任務
于是,日常開發/編譯工作流就時常被阻塞于
warning: spurious network error (1 tries remaining): [35] SSL connect error (schannel: failed to receive handshake, SSL/TLS connection failed); class=Net (12) Caused by: Unable to update registry `crates-io` Caused by: failed to fetch `https://github.com/rust-lang/crates.io-index` Caused by: [35] SSL connect error (schannel: failed to receive handshake, SSL/TLS connection failed); class=Net (12)
的網絡錯誤上。這實在令人感覺挫敗!
另一方面,雖然“搬梯子”能夠緩解問題,但面對頻繁的cargo check/run
指令執行(特別是,莫名其妙出現的“全量索引同步”現象),其“按流量·計費”的經濟成本著實令人肉疼。
所以,我下定決心在業余時間搞一個【條件·離線·編譯】的命令行工具,來拯救自己于迷茫。
最理想的使用模型
-
僅首次編譯·或·在依賴項變更時,
cargo
命令才【連線】編譯與同步本地的crates.io-index索引清單 —— 有限且可控的“搬梯子”還是可以經濟承受的。 -
在所有其它時候,
cargo
命令皆【離線】編譯 —— 沒事少連線github.com。
工作原理
cargo-offline
命令會
-
透傳所有命令行參數給底層的
cargo
指令 -
尋找距離
cargo-offline
執行目錄最近的Cargo.toml
文件,無論該配置文件-
是【工作區
workspace
】配置文件 -
還是【工作區·成員
workspace.member
】配置文件。
-
-
比較被找到的
Cargo.toml
文件·是否·被修改過 —— 就是對比該文件的【最后·修改時間】屬性值是否發生了變化。 -
若
Cargo.toml
文件的·最后修改時間·變化了,就給被透傳的參數列表額外添加--offline
參數項。 -
于是,
cargo
命令就會進入【離線模式】編譯了。
Cargo.toml
文件修改時間的保存位置
判斷Cargo.toml
文件·是否·被修改過,關鍵需要:
-
緩存·在上一次編譯時·讀取的
Cargo.toml
文件【修改時間】屬性值 -
再,使用【緩存·時間值】與當前【文件修改時間】比大小
就將Cargo.toml
文件【修改時間】保存于何處,cargo-offline
程序提供了兩套備選方案:
-
直接保存到
Cargo.toml
文件自身里,和作為***.metadata配置塊內一個鍵值對。-
被
toml crate
編輯過的Cargo.toml
文件,它內部 -
程序·會額外地依賴
cargo_toml crate
。所以,編譯輸出的二進制文件會更大那么一點點兒。 -
編譯指令·會額外地開啟【不穩定
feature
】file_set_times
-
“配置塊”會被重新排序
-
“雙引號”會被替換為“單引號”。
-
不會在工程目錄下引入新文件了。
-
也不用修改
.gitignore
文件添加例外規則了。 -
就【工作區】而言,保存配置塊是
[workspace.metadata]
-
就【工作區·成員】和【普通工程】而言,保存配置塊是
[package.metadata]
-
優點:
-
缺點:
-
-
保存于獨立的
*.toml
配置文件內。-
需手工地向
.gitignore
文件添加cargo-offline-config.toml
文件名。 -
Cargo.toml
文件可保持“無損”。 -
少一個程序依賴項
-
避免開啟【不穩定
feature
】 -
即,與
Cargo.toml
文件同目錄的cargo-offline-config.toml
文件。目前,此文件名是在代碼內被硬編碼的。 -
優點:
-
缺點:
-
值得一提的是,**Cargo.toml
文件【修改時間】保存位置的選擇是【編譯時·決策】,而不是【運行時·決策】。**即,
-
以
Cargo features
作為編譯條件 -
根據不同的決策選擇
-
編譯輸出不一樣的二進制行可執行文件作為結果。
安裝
此命令行工具crate
已經被發布至crates.io包倉庫。所以,我就未對各主流平臺與架構準備·預編譯包(感謝偉大的包管理器!)。
-
選擇緩存
Cargo.toml
文件【修改時間】至Cargo.toml [metadata]
的同學,執行這條安裝指令:cargo install cargo-offline --features=cargo-metadata
-
選擇緩存
Cargo.toml
文件【修改時間】至cargo-offline-config.toml
獨立文件的同學,執行這條安裝指令:cargo install cargo-offline --features=toml-config
因為我沒有給Cargo Package
設置default features
,所以完全忽略--features=
命令行參數會導致源碼編譯錯誤。惡作劇地,同時指定--features=cargo-metadata
與--features=toml-config
也會導致編譯失敗。
一旦被安裝成功之后,cargo-offline.exe
可執行文件就會
-
出現在
%CARGO_HOME%in
目錄下 -
從
PATH
環境變量劃定的搜索范圍,可見 -
可從命令行直接運行
使用
cargo-offline
命令的執行也有兩種方式可供選擇:
-
作為獨立命令,執行
cargo-offline
。后隨和標準cargo
命令相同的命令行參數(這些參數會被透傳給cargo
指令的)。比如,cargo-offline check
-
作為
cargo
指令的子命令,執行cargo offline
。比如,cargo offline check
cargo-offline
的命令行參數與cargo
完全相同,因為cargo-offline
僅只做了透傳處理。
源碼也精彩,歡迎來品鑒
不是語句的堆疊,而是講究了“套路”。被涉及到的【設計模式】包括但不限于:
-
【條件編譯】
plus
【策略·設計模式】 —— 解決Cargo.toml
文件【修改時間】保存位置的選擇問題。-
【策略·模式】大約對等于
OOP
里的【控制反轉IoC
】plus
【依賴注入DI
】的組合。在我的代碼,從IoC
容器到DI
注入項都是自寫的。 -
欲深入了解【策略·模式】的細節理論,我推薦文章淺聊Rust【策略·設計模式】Strategy / Policy design pattern —— 歡迎點贊、發評論與轉發分享。
-
-
Builder
設計模式 —— 解決struct
局部初始化的問題。-
其大約對等于
OOP
里【工廠模式】。 -
但,親手給每個
struct
編寫Builder
,那不是傻嗎!多大的工作量呀!我的選擇是derive_builder。
-
-
Option / Result
枚舉類的“拆/裝箱”配合器【Combinator
模式】 —— 避免丑陋且有panic
風險的.unwrap()
“拆箱”操作。-
有那么一點兒
ramda
鏈式函數調用的感覺了。餒餒的【函數編程·范式】。
-
-
規則宏
macro-by-example
—— 避免代碼重復。-
這是【結構相同·但·類型不同】代碼塊復用的利器呀!
-
以【宏】的思維來復用代碼,得花費一段時間來適應。
-
關于·編譯
重要,十分重要:因為【不穩定feature
】file_set_times
在程序中被條件地開啟,所以該Cargo Package
工程依賴的rustup
工具鏈被鮮明地鎖定于nightly
版本。若你git clone
此工程至本地,請先安裝nightly
版的rustc
再編譯執行之。否則,會報錯的。
另外,推薦使用VSCode
編輯與編譯cargo-offline
工程,因為我已經配置好了:
-
Ctrl + Shift + B
直接·編譯+
執行。 -
在安裝了
CodeLLDB
插件之后,F5
就先編譯,再進入斷點調試模式。
無論采用上面哪種方式編譯程序,VSCode
都會彈出【下拉·選擇器】,要求選擇輸入【自定義cargo feature
】。所以,請注意使用【上下箭頭】與【回車】鍵,響應VSCode
的選擇要求。
后續路圖
若今后給該·命令行工具·添加更多功能與配置選項,我計劃上【GUI
圖形界面】,考慮到我的win32
與Gnome.GTK3
編程經歷與背景。
-
代碼
+關注
關注
30文章
4787瀏覽量
68589 -
編譯
+關注
關注
0文章
657瀏覽量
32869 -
Win32
+關注
關注
0文章
11瀏覽量
8114
原文標題:命令
文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論