Google工程師Russ Cox在在官網向社群徵詢GO套件版本控制的意見,提出語意輸入版本控制(Semantic Import Versioning)的想法,並實作了vgo(Versioned Go)放在GitHub上,希望社群成員在使用後能給予意見回饋。

Go在套件上的版本控制一直沒有較佳的解決方案,不少的先進開發語言,都有其社群慣用的套件管理工具,不論是Java的Maven,或是Rust的Cargo,甚至是Node的Npm,雖然目前Go官方有釋出Dep來填補這個功能缺口,但是仍不夠理想,Russ Cox認為,Dep有其致命的缺點,便是缺乏對大型程式的支援。

由Go重要社群成員Sam Boyer帶領的團隊,參考Rust的Cargo後,著手開發官方的套件管理工具Dep,Russ Cox表示,隨著工具的發展,他們認知到一開始的計畫,有必要為往後相容問題做出修正,使用語意輸入版本控制是他們目前想到可行的方法。

套件相容問題必須考慮Go語言的兩條套件規則,第一為輸入的相容性原則(Import Compatibility Rule),當舊套件與新套件使用相同的輸入路徑,兩者就必須相容。第二是輸入的唯一性原則(Import Uniqueness Rule),不同套件必須使用不同的輸入路徑。他們認知到,使用語意版本控制而不使用語意輸入版本控制,需要放棄部分程式碼升級或是輸入唯一性,在兩規則中二擇一。

Russ Cox表示,Cargo的作法便是放棄輸入唯一性以達到部分程式碼升級,而原本Dep的作法則是放棄部分程式碼升級,確保輸入的唯一性,但這同時也表示放棄建構大型程式的可能性。他認為,Cargo的作法是正確的做法,而Dep也沒有錯,因為受限於Go先天的限制。

因此為了不在兩者中選擇,使用語意輸入版本控制是必要的,同時在安裝的路徑上註明版本號,並且使用語意版本的表達方式,列出主版本號、小版本號以及補丁版本號。

雖然Dep看似可以滿足現在Go套件的版本控制需求,但是Russ Cox表示,他仍然對於缺乏對大型程式支援感到擔心,因此著手建立vgo實現語意輸入版本控制的想法。他認為,這件事將關乎Go語言未來的發展,並希望社群可以持續的回饋意見,而他們也會繼續在會議中討論這件事。

熱門新聞

Advertisement