Cargo.toml和Cargo.lock各有其目的。在我們談?wù)撍鼈冎?,這是一個(gè)總結(jié):
如果您正在構(gòu)建,其他項(xiàng)目要依賴的庫,請將Cargo.lock放置在你的.gitignore。如果您正在構(gòu)建可執(zhí)行文件,如命令行工具或應(yīng)用程序,請檢查Cargo.lock位于git管理下。如果你對這是為什么感到好奇,請參閱"為什么二進(jìn)制文件在版本控制系統(tǒng)中有Cargo.lock,而庫沒有?" - FAQ .
讓我們再挖掘一下.
Cargo.toml是一個(gè)manifest(清單),我們可以在其中指定一系列關(guān)于我們項(xiàng)目的不同元數(shù)據(jù)的文件。例如,我們可以說我們依賴于另一個(gè)項(xiàng)目:
[package]
name = "hello_world"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
[dependencies]
rand = { git = "https://github.com/rust-lang-nursery/rand.git" }
這個(gè)項(xiàng)目有一個(gè)依賴關(guān)系rand箱。在這種情況下,我們已經(jīng)說過,我們依賴于 GitHub 上的特定 Git 存儲庫。由于我們尚未指定任何其他信息,因此 Cargo 假定我們打算使用最新提交的master分支構(gòu)建我們的項(xiàng)目。
聽起來不錯(cuò)? 嗯,但有一個(gè)問題: 如果你今天構(gòu)建這個(gè)項(xiàng)目,然后你發(fā)送一份副本給我,我明天構(gòu)建這個(gè)項(xiàng)目,可能會發(fā)生一些不好的事情。因在此期間,可能會有更多的rand提交,我的構(gòu)建將包括新的提交,而你的不會。因此,我們會得到不同的構(gòu)建。這很糟糕,因?yàn)槲覀冃枰芍貜?fù)的構(gòu)建.
我們可以通過放置一個(gè)rev來解決這個(gè)問題,寫入我們Cargo.toml:
[dependencies]
rand = { git = "https://github.com/rust-lang-nursery/rand.git", rev = "9f35b8e" }
現(xiàn)在我們的構(gòu)建將是相同的。但是有一個(gè)很大的缺點(diǎn):現(xiàn)在我們每次想要更新庫時(shí),都必須手動考慮 SHA-1。這既乏味又容易出錯(cuò).
那現(xiàn)在Cargo.lock登場了。由于它的存在,我們不需要手動跟蹤確切的修訂版本: Cargo 將為我們做。當(dāng)我們有這樣的清單時(shí):
[package]
name = "hello_world"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
[dependencies]
rand = { git = "https://github.com/rust-lang-nursery/rand.git" }
Cargo 將采取最新的提交,并在我們第一次構(gòu)建時(shí),將這些信息寫入我們的Cargo.lock。該文件將如下所示:
[root]
name = "hello_world"
version = "0.1.0"
dependencies = [
"rand 0.1.0 (git+https://github.com/rust-lang-nursery/rand.git#9f35b8e439eeedd60b9414c58f389bdc6a3284f9)",
]
[[package]]
name = "rand"
version = "0.1.0"
source = "git+https://github.com/rust-lang-nursery/rand.git#9f35b8e439eeedd60b9414c58f389bdc6a3284f9"
你可以看到這里有更多的信息,包括我們用來構(gòu)建的確切修訂版本。現(xiàn)在,當(dāng)您將項(xiàng)目交給其他人時(shí),他們將使用完全相同的 SHA,即使我們沒有在我們的項(xiàng)目Cargo.toml中指定它.
當(dāng)我們準(zhǔn)備選擇,更新庫的版本時(shí),Cargo 會自動重新計(jì)算依賴關(guān)系,并為我們更新內(nèi)容:
$ cargo update # updates all dependencies
$ cargo update -p rand # updates just “rand”
這將寫出一個(gè)新的Cargo.lock與新版本信息。請注意cargo update參數(shù),實(shí)際上會是是一個(gè)包 ID 規(guī)范,和rand只是一個(gè)簡短的規(guī)范.
更多建議: