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