讓fabric 2.0 external builder在windows上跑起來

前言

fabric2.0 可以使用external builder跑chaincode源碼,方便chaincode調試,但是external builder編譯和啓動chaincode等操作使用的是4個bash腳本,而windows原生不支持bash。

折騰

經過一番研究(折騰),我發現只要完成以下3個步驟,即可在windows上run external chaincode。
1、安裝git-windows,記住安裝目錄
2、安裝jq(不低於1.6版本),放到git安裝目錄底下的usr/bin裏面,並改名爲jq
3、修改core/container/externalbuilder/externalbuilder.go
添加兼容windows的執行bash的代碼:

// convert windows path format to unix path because bash only support unix path format
// if wpath is unix path format, it won't return wpath directly.
func winPath2UnixPath(wpath string) (upath string) {
	vname := filepath.VolumeName(wpath)
	if strings.HasSuffix(vname, ":") {
		upath = "/" + strings.ToLower(vname[:len(vname) - 1])
		upath += filepath.ToSlash(wpath[len(vname):])
	} else {
		upath = filepath.ToSlash(wpath)
	}
	return
}

func (b *Builder) NewCommand(name string, args ...string) *exec.Cmd {
	//cmd := exec.Command(name, args...)
	var cmd *exec.Cmd
	// If you use windows, you should download git-windows and jq(version >= 1.6) firstly.
	if runtime.GOOS == "windows" {
		cmdString := winPath2UnixPath(name)
		for _, arg := range args {
			cmdString +=" " + winPath2UnixPath(arg)
		}
		// Both windows and linux support bash -c "cmd args..." type.
		cmd = exec.Command("bash", "-c", cmdString)
	} else {
		cmd = exec.Command(name, args...)
	}

	whitelist := appendDefaultWhitelist(b.EnvWhitelist)
	for _, key := range whitelist {
		if val, ok := os.LookupEnv(key); ok {
			cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", key, val))
		}
	}
	return cmd
}

4、添加core.yaml中關於endpoint和externalBuilders的配置

endpoint:
externalBuilders:
      - path: E:\share_vir\go\src\github.com\hyperledger\fabric\myNetwork\externalbuilders\golang
        name: external-golang
        environmentWhitelist:
          - GOPROXY
          - GOCACHE
          - GOPATH

注:這一步是使用windows和linux都需要做的。

說明

1、安裝git-windows後會自帶一個bash.exe,但是它支持的linux命令有限,缺少external buidler那4個腳本用到的jq命令。
2、jq.exe 1.5版本有個bug,如果傳入的參數長度過長,就會段錯誤。
3、bash只能識別unix path, 代碼主要用於將windows path轉化爲unix path,然後使用bash -c "xxx"這種形式調用腳本。

執行環境

4、core.yaml中external builder,path設置爲絕對路徑;environmentWhitelist列舉的是運行4個bash腳本需要的環境變量,主要用於支持go build。

externalBuilders:
      - path: E:\share_vir\go\src\github.com\hyperledger\fabric\myNetwork\externalbuilders\golang
        name: external-golang
        environmentWhitelist:
          - GOPROXY
          - GOCACHE
          - GOPATH
更進一步

4個bash腳本的運行環境是受限的,所有環境變量都靠bash傳入。

從1.12開始,go build強制要求GOCACHE,因此需要傳入GOCACHE。如果沒改過GOCACHE的默認路徑,不傳入GOCACHE,改爲傳入LocalAppData(linux爲$HOME)也行,go可以推斷出GOCACHE的路徑。

go build支持mod的代碼時,會自動下載依賴,將GOPROXY設置爲七牛雲維護的地址,可以快速拉包。

go env -w GOPROXY=https://goproxy.cn,direct

5、在IDE裏面運行peer,需要配置FABRIC_CFG_PATH, GOCACHE和GOPROXY(如果已經設置成系統環境變量,則可不配置)。
6、環境變量傳遞路徑:IDE–>peer–>bash–>4個bash腳本。
7、detect腳本限定了type和label,因此lifecycle chaincode package時指定的–label 後綴必須爲-external,–lang 必須爲golang。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章