0%

Custom build process in Golang / Rust

這需求有點奇怪,不過這倒是我想要的編譯流程
先從Golang來說吧,1.11前的版本只會把dependency module都裝入GOPATH中,就算有godep之類的東西也覺得不好用

由於自己是Developer,需要分析Module間的互動,甚至改改程式碼,分析一下,放在GOPATH不是不好,只是我想要以下的需求

– 修改Dependcny Module的程式碼,由於牽一髮動全身,改動之後可能造成其他相依於此Module的全部掛點
– 希望放在Repo附近,而不是在GOPATH底下尋找

Cargo跟GoLang的行為模式差不多,Module放在.cargo底下
不利於開發研究

於是找出一套屬於自己的方式了

Golang

首先,先安裝到Golang 1.11以上
go-fastdfs舉例,他缺少go.mod,於是我們自行補上

1
2
3
4
5
6
7
8
9
10
11
$ git clone https://github.com/sjqzhang/go-fastdfs
$ cd go-fastdfs
$ rm vendor -r # 刪除掉原先的vendor目錄
$ go mod init
go: creating new go.mod: module github.com/sjqzhang/go-fastdfs
$ go mod vendor # 這下Dependcy Module都在vendor底下了
$ go build -mod=vendor # 產生go-fastdfs了
# 接著在修改vendor/github.com/astaxie/beego/httplib/httplib.go
# 使其編譯不過
$ go build -mod=vendor
./fileserver.go:264:13: undefined: httplib.BeegoHTTPSettings

看來真的是用vendor目錄下的Module下去編譯

Rust

Cargo的部分麻煩一點
首先先安裝cargo-vendor

1
$ cargo install cargo-vendor

yamux來舉例

1
2
3
4
$ git clone https://github.com/paritytech/yamux
$ cd yamux
$ cargo vendor > ~/.cargo/config
$ cargo build

如果要修改vendor裡面的東西比較麻煩
假設我們修改vendor/tokio-io/src/framed_read.rs
下build之後可能出現

1
2
3
4
5
6
$ cargo build
error: the listed checksum of `/yamux/vendor/tokio-io/src/framed_read.rs` has changed:
expected: 07e36ff58fe30bf7b0aa28a998b0bc4e2f78acd04cc1570a877b4eeac1cadcf7
actual: d10d30e1bc1f1d1abc7c28db97fd37ee374d029329aaa78df328bb076163363d

directory sources are not intended to be edited, if modifications are required then it is recommended that [replace] is used with a forked copy of the source

由於我們改了檔案,checksum算出來就不同了
簡易的方案就是在root dir的Cargo.tmol上加上

1
2
[replace]
"tokio-io:0.1.11" = { path = './vendor/tokio-io' }

注意版本號要跟vendor的目錄相同,不然無法編譯