fabric 2.0 external builderをwindowsで走らせる

10648 ワード

前言
fabric 2.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バージョンにバグがあり、入力されたパラメータの長さが長すぎるとセグメントエラーになります.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でなければなりません.