看過來

初來乍到者,請參閱這篇「緣起」。它是總索引!

2017年3月19日 星期日

[Rust] cargo.lock 究竟該不該放入 git 倉庫?

撰寫 rust 程式時,使用 cargo init 或是 cargo new 來初始化一個新的專案。新初始化的專案中已經設定好本地 git 程式倉庫,並且附帶了 .gitignore 檔案,省去了不少設定上的麻煩。

然而,執行檔專案(cargo init --bin)以及程式庫專案的 .gitignore 內容卻不一樣:程式庫專案的 .gitignore 指出,Cargo.lock 不會被放入 git 程式倉庫中;執行檔專案則相反。這是為何呢?

依據 Cargo guide 所述,cargo.lock 是描述一個專案建置時所使用的所有完整相依條件。(跟 yarn.lock 很像。)這也就是說,cargo.lock 裡面紀錄了你的相依元件的版本(cargo.toml 只有版本要求,例如某個版本以上,或是範圍內),以及你相依元件的相依元件的版本。

總之您可以利用 cargo.lock 裡面的資訊來說明您開發時所使用的所有相依元件的版本恰為多少多少。若使用和 cargo.lock 內相同版本的元件就可以成功進行編譯。

上面所描述的「版本鎖定」可以對執行檔的所有相依元件進行版本鎖定,確保在別台機器上面可以重現建置,甚至執行結果。因此我們在撰寫執行檔專案時,必須把 cargo.lock 放入 git 程式倉庫中。

但如果是程式庫呢?若是使用 cargo.lock 來限制程式庫的相依元件版本,則本身作為其他程式(下稱主專案)相依元件的程式庫本身的相依元件可能會和主專案的其他相依元件,或是其他相依元件的相依元件有版本衝突。所以在撰寫程式庫專案時,不能把 cargo.lock 放入 git 程式倉庫中。

參考資料

http://doc.crates.io/guide.html#cargo.toml-vs-cargo.lock
http://doc.crates.io/faq.html#why-do-binaries-have-cargolock-in-version-control-but-not-libraries

沒有留言:

張貼留言