0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

cargo-offline命令解讀

jf_wN0SrCdH ? 來源:Rust語言中文社區(qū) ? 作者:Rust語言中文社區(qū) ? 2022-12-01 15:41 ? 次閱讀

cargo-offline命令

cargo-offline是標(biāo)準(zhǔn)cargo命令的包裝器。其被用來,根據(jù)·距離cargo-offline命令執(zhí)行目錄最近的Cargo.toml文件是否被修改過,來給被包裝的cargo命令條件地增補(bǔ)--offline命令行參數(shù)(即,離線編譯)。形象地講,就是將cargo check條件地變形為cargo check --offline。

  1. 項(xiàng)目鏈接:https://github.com/stuartZhang/cargo-offline

  2. 包倉庫鏈接:https://crates.io/crates/cargo-offline

  3. 代碼也精彩,真不是簡(jiǎn)單的代碼堆疊,而是有套路,和講套路的。

    1. 先點(diǎn)個(gè)star

    2. 再直接導(dǎo)航至:https://github1s.com/stuartZhang/cargo-offline

動(dòng)機(jī)

最近一段時(shí)間,github.com訪問的穩(wěn)定性實(shí)在很差。但,執(zhí)行cargo命令總是要求

  • 首先,同步crates.io-index索引清單。

  • 然后,執(zhí)行目標(biāo)任務(wù)

于是,日常開發(fā)/編譯工作流就時(shí)常被阻塞于


	

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)

網(wǎng)絡(luò)錯(cuò)誤上。這實(shí)在令人感覺挫??!

另一方面,雖然“搬梯子”能夠緩解問題,但面對(duì)頻繁的cargo check/run指令執(zhí)行(特別是,莫名其妙出現(xiàn)的“全量索引同步”現(xiàn)象),其“按流量·計(jì)費(fèi)”的經(jīng)濟(jì)成本著實(shí)令人肉疼。

所以,我下定決心在業(yè)余時(shí)間搞一個(gè)【條件·離線·編譯】的命令行工具,來拯救自己于迷茫。

最理想的使用模型

  • 首次編譯·或·在依賴項(xiàng)變更時(shí),cargo命令才【連線】編譯與同步本地的crates.io-index索引清單 —— 有限且可控的“搬梯子”還是可以經(jīng)濟(jì)承受的。

  • 在所有其它時(shí)候,cargo命令皆【離線】編譯 —— 沒事少連線github.com。

工作原理

cargo-offline命令會(huì)

  1. 透?jìng)魉忻钚袇?shù)給底層的cargo指令

  2. 尋找距離cargo-offline執(zhí)行目錄最近的Cargo.toml文件,無論該配置文件

    1. 是【工作區(qū)workspace】配置文件

    2. 還是【工作區(qū)·成員workspace.member】配置文件。

  3. 比較被找到的Cargo.toml文件·是否·被修改過 —— 就是對(duì)比該文件的【最后·修改時(shí)間】屬性值是否發(fā)生了變化。

  4. Cargo.toml文件的·最后修改時(shí)間·變化了,就給被透?jìng)鞯膮?shù)列表額外添加--offline參數(shù)項(xiàng)。

  5. 于是,cargo命令就會(huì)進(jìn)入【離線模式】編譯了。

Cargo.toml文件修改時(shí)間的保存位置

判斷Cargo.toml文件·是否·被修改過,關(guān)鍵需要:

  • 緩存·在上一次編譯時(shí)·讀取的Cargo.toml文件【修改時(shí)間】屬性值

  • 再,使用【緩存·時(shí)間值】與當(dāng)前【文件修改時(shí)間】比大小

就將Cargo.toml文件【修改時(shí)間】保存于何處,cargo-offline程序提供了兩套備選方案:

  • 直接保存到Cargo.toml文件自身里,和作為***.metadata配置塊內(nèi)一個(gè)鍵值對(duì)。

    • toml crate編輯過的Cargo.toml文件,它內(nèi)部

    • 程序·會(huì)額外地依賴cargo_toml crate。所以,編譯輸出的二進(jìn)制文件會(huì)更大那么一點(diǎn)點(diǎn)兒。

    • 編譯指令·會(huì)額外地開啟【不穩(wěn)定featurefile_set_times

    • “配置塊”會(huì)被重新排序

    • “雙引號(hào)”會(huì)被替換為“單引號(hào)”。

    • 不會(huì)在工程目錄下引入新文件了。

    • 也不用修改.gitignore文件添加例外規(guī)則了。

    • 就【工作區(qū)】而言,保存配置塊是[workspace.metadata]

    • 就【工作區(qū)·成員】和【普通工程】而言,保存配置塊是[package.metadata]

    • 優(yōu)點(diǎn):

    • 缺點(diǎn):

  • 保存于獨(dú)立的*.toml配置文件內(nèi)。

    • 需手工地向.gitignore文件添加cargo-offline-config.toml文件名。

    • Cargo.toml文件可保持“無損”。

    • 少一個(gè)程序依賴項(xiàng)

    • 避免開啟【不穩(wěn)定feature

    • 即,與Cargo.toml文件同目錄的cargo-offline-config.toml文件。目前,此文件名是在代碼內(nèi)被硬編碼的。

    • 優(yōu)點(diǎn):

    • 缺點(diǎn):

值得一提的是,**Cargo.toml文件【修改時(shí)間】保存位置的選擇是【編譯時(shí)·決策】,而不是【運(yùn)行時(shí)·決策】。**即,

  • Cargo features作為編譯條件

  • 根據(jù)不同的決策選擇

  • 編譯輸出不一樣的二進(jìn)制行可執(zhí)行文件作為結(jié)果。

安裝

此命令行工具crate已經(jīng)被發(fā)布至crates.io包倉庫。所以,我就未對(duì)各主流平臺(tái)與架構(gòu)準(zhǔn)備·預(yù)編譯包(感謝偉大的包管理器?。?。

  • 選擇緩存Cargo.toml文件【修改時(shí)間】至Cargo.toml [metadata]的同學(xué),執(zhí)行這條安裝指令:

    
    			

    cargo install cargo-offline --features=cargo-metadata

  • 選擇緩存Cargo.toml文件【修改時(shí)間】至cargo-offline-config.toml獨(dú)立文件的同學(xué),執(zhí)行這條安裝指令:

    
    			

    cargo install cargo-offline --features=toml-config

因?yàn)槲覜]有給Cargo Package設(shè)置default features,所以完全忽略--features=命令行參數(shù)會(huì)導(dǎo)致源碼編譯錯(cuò)誤。惡作劇地,同時(shí)指定--features=cargo-metadata--features=toml-config也會(huì)導(dǎo)致編譯失敗。

一旦被安裝成功之后,cargo-offline.exe可執(zhí)行文件就會(huì)

  • 出現(xiàn)在%CARGO_HOME%in目錄下

  • PATH環(huán)境變量劃定的搜索范圍,可見

  • 可從命令行直接運(yùn)行

使用

cargo-offline命令的執(zhí)行也有兩種方式可供選擇:

  1. 作為獨(dú)立命令,執(zhí)行cargo-offline。后隨和標(biāo)準(zhǔn)cargo命令相同的命令行參數(shù)(這些參數(shù)會(huì)被透?jìng)鹘ocargo指令的)。比如,

    
    			

    cargo-offline check

  2. 作為cargo指令的子命令,執(zhí)行cargo offline。比如,

    
    			

    cargo offline check

cargo-offline的命令行參數(shù)與cargo完全相同,因?yàn)?code style="background:rgb(251,241,199);font-family:'Source Code Pro', 'Fira Code', Menlo, Monaco, Consolas, 'DejaVu Sans Mono', Inconsolata, 'Courier New', monospace;">cargo-offline僅只做了透?jìng)魈幚怼?/p>

源碼也精彩,歡迎來品鑒

不是語句的堆疊,而是講究了“套路”。被涉及到的【設(shè)計(jì)模式】包括但不限于:

  1. 【條件編譯】plus【策略·設(shè)計(jì)模式】 —— 解決Cargo.toml文件【修改時(shí)間】保存位置的選擇問題。

    1. 【策略·模式】大約對(duì)等于OOP里的【控制反轉(zhuǎn)IoCplus【依賴注入DI】的組合。在我的代碼,從IoC容器到DI注入項(xiàng)都是自寫的。

    2. 欲深入了解【策略·模式】的細(xì)節(jié)理論,我推薦文章淺聊Rust【策略·設(shè)計(jì)模式】Strategy / Policy design pattern —— 歡迎點(diǎn)贊、發(fā)評(píng)論與轉(zhuǎn)發(fā)分享。

  2. Builder設(shè)計(jì)模式 —— 解決struct局部初始化的問題。

    1. 其大約對(duì)等于OOP里【工廠模式】。

    2. 但,親手給每個(gè)struct編寫Builder,那不是傻嗎!多大的工作量呀!我的選擇是derive_builder。

  3. Option / Result枚舉類的“拆/裝箱”配合器【Combinator模式】 —— 避免丑陋且有panic風(fēng)險(xiǎn)的.unwrap()“拆箱”操作。

    1. 有那么一點(diǎn)兒ramda鏈?zhǔn)胶瘮?shù)調(diào)用的感覺了。餒餒的【函數(shù)編程·范式】。

  4. 規(guī)則宏macro-by-example—— 避免代碼重復(fù)。

    1. 這是【結(jié)構(gòu)相同·但·類型不同】代碼塊復(fù)用的利器呀!

    2. 以【宏】的思維來復(fù)用代碼,得花費(fèi)一段時(shí)間來適應(yīng)。

關(guān)于·編譯

重要,十分重要:因?yàn)椤静环€(wěn)定featurefile_set_times在程序中被條件地開啟,所以該Cargo Package工程依賴的rustup工具鏈被鮮明地鎖定于nightly版本。若你git clone此工程至本地,請(qǐng)先安裝nightly版的rustc再編譯執(zhí)行之。否則,會(huì)報(bào)錯(cuò)的。

另外,推薦使用VSCode編輯與編譯cargo-offline工程,因?yàn)槲乙呀?jīng)配置好了:

  1. Ctrl + Shift + B直接·編譯+執(zhí)行。

  2. 在安裝了CodeLLDB插件之后,F5就先編譯,再進(jìn)入斷點(diǎn)調(diào)試模式。

無論采用上面哪種方式編譯程序,VSCode都會(huì)彈出【下拉·選擇器】,要求選擇輸入【自定義cargo feature】。所以,請(qǐng)注意使用【上下箭頭】與【回車】鍵,響應(yīng)VSCode的選擇要求。

后續(xù)路圖

若今后給該·命令行工具·添加更多功能與配置選項(xiàng),我計(jì)劃上【GUI圖形界面】,考慮到我的win32Gnome.GTK3編程經(jīng)歷與背景。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68237
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    649

    瀏覽量

    32775
  • Win32
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    8105

原文標(biāo)題:命令

文章出處:【微信號(hào):Rust語言中文社區(qū),微信公眾號(hào):Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SD的命令和響應(yīng)

    一個(gè)完整的?SD?卡操作過程是:主機(jī)(單片機(jī)等)發(fā)起“命令”,SD?卡根據(jù)命令的內(nèi)容決定是 否發(fā)送響應(yīng)信息及數(shù)據(jù)等,如果是數(shù)據(jù)讀/寫操作,主機(jī)還需要發(fā)送停止讀/寫數(shù)據(jù)的命令來結(jié)束 本次操作,這意味著主機(jī)發(fā)起
    的頭像 發(fā)表于 10-08 15:49 ?276次閱讀
    SD的<b class='flag-5'>命令</b>和響應(yīng)

    安裝esp-idf-tools-setup-offline-5.1.2.exe到結(jié)尾運(yùn)行python時(shí)顯示應(yīng)用程序無法正常啟動(dòng)如何解決?

    安裝esp-idf-tools-setup-offline-5.1.2.exe到結(jié)尾運(yùn)行python時(shí)顯示應(yīng)用程序無法正常啟動(dòng)(0xc000007b),如何解決
    發(fā)表于 07-24 07:50

    lscpu命令使用注意事項(xiàng)

    請(qǐng)注意,lscpu命令在不同的操作系統(tǒng)上可能會(huì)有一些差異,某些選項(xiàng)可能不可用??梢酝ㄟ^man lscpu命令或lscpu --help命令查看該命令的幫助文檔和更多選項(xiàng)。
    發(fā)表于 03-14 11:39 ?734次閱讀

    Linux基本命令總結(jié)

    都說Linux命令多,實(shí)際工作中我們又有多少命令會(huì)接觸用到呢?本文跟大家分享Linux運(yùn)維工作中常用的600個(gè)命令,可以說這些命令是伴隨著大家一生的運(yùn)維生涯了,看看大家有哪些還沒用過的
    的頭像 發(fā)表于 01-11 10:32 ?934次閱讀

    安捷倫示波器DSO9104A量測(cè)頁面顯示offline,按鈕無法操作

    安捷倫示波器DSO9104A量測(cè)頁面顯示offline,按鈕無法操作,需要怎么解決
    發(fā)表于 12-25 15:21

    IGBT和模塊的標(biāo)準(zhǔn)體系解讀

    IGBT和模塊的標(biāo)準(zhǔn)體系解讀
    的頭像 發(fā)表于 12-14 11:38 ?1155次閱讀
    IGBT和模塊的標(biāo)準(zhǔn)體系<b class='flag-5'>解讀</b>

    uboot命令的執(zhí)行過程是什么

    U-boot是通過執(zhí)行u-boot提供的命令來加載Linux內(nèi)核的,其中 命令bootm的功能 即為從memory啟動(dòng)Linux內(nèi)核映像文件。 在講解bootm加載內(nèi)核之前,先來看看u-boot中
    的頭像 發(fā)表于 12-04 17:31 ?733次閱讀

    python調(diào)用windows命令

    Python是一種強(qiáng)大的編程語言,可以用于開發(fā)各種不同類型的應(yīng)用程序。其中一個(gè)常見的用途是使用Python調(diào)用Windows命令來執(zhí)行特定的任務(wù)。在本文中,我們將詳細(xì)討論如何使用Python調(diào)用
    的頭像 發(fā)表于 11-29 14:34 ?965次閱讀

    ifconfig配置靜態(tài)ip命令

    ifconfig命令用于配置和管理網(wǎng)絡(luò)接口,包括接口的IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)、以及其他網(wǎng)絡(luò)配置參數(shù)。在本篇文章中,我們將詳細(xì)介紹如何使用ifconfig命令來配置靜態(tài)IP。 ifconfig命令
    的頭像 發(fā)表于 11-27 14:31 ?4488次閱讀

    Android開發(fā)logcat命令介紹

    logcat命令介紹 具體的參數(shù)使用可以通過命令查看,或者查看具體的源碼,當(dāng)然直接查看命令較為方便。 3.1 logcat幫助命令 3.2 日志等級(jí): 3.3 查看緩沖區(qū)buffer:
    的頭像 發(fā)表于 11-23 17:18 ?316次閱讀
    Android開發(fā)logcat<b class='flag-5'>命令</b>介紹

    linux關(guān)閉docker的命令

    在 Linux 系統(tǒng)中,關(guān)閉 Docker 的操作可以通過以下多種方式進(jìn)行。本文將詳細(xì)講解每一種方式,并提供示例代碼和命令,以幫助讀者更好地理解和實(shí)踐。 使用 docker 命令 最常用的方法
    的頭像 發(fā)表于 11-23 09:39 ?2703次閱讀

    docker exec命令的使用方法

    Docker是一種開源的容器化平臺(tái),可以讓開發(fā)人員在容器中打包和運(yùn)行應(yīng)用程序。它提供了一種快速、可靠和一致的方式來構(gòu)建、部署和運(yùn)行應(yīng)用程序。Docker exec命令是Docker提供的一個(gè)非常
    的頭像 發(fā)表于 11-23 09:33 ?1526次閱讀

    Python自帶的命令窗口

    Python自帶的命令窗口,也稱為Python交互式解釋器,是Python編程語言的一個(gè)重要工具,它允許用戶在命令行界面中輸入和執(zhí)行Python代碼。不同于編寫腳本并保存為文件后再執(zhí)行,Python
    的頭像 發(fā)表于 11-22 14:02 ?859次閱讀

    linux重啟命令有哪些

    Linux是一種自由和開放源代碼的操作系統(tǒng),被廣泛應(yīng)用于服務(wù)器和嵌入式設(shè)備。在Linux中,有多種命令用于重啟系統(tǒng)。在本文中,我們將詳細(xì)介紹常用的Linux重啟命令并解釋每個(gè)命令的用途
    的頭像 發(fā)表于 11-17 09:49 ?1945次閱讀

    linux查看物理接口的命令

    Linux操作系統(tǒng)提供了多種命令和工具來查看物理接口。在這篇文章中,我們將詳細(xì)介紹一些最常用和常見的命令,以及它們的用法和輸出。 ifconfig命令 ifconfig命令是一個(gè)最常用
    的頭像 發(fā)表于 11-16 16:48 ?1124次閱讀