Fabric源码编译及示例

作者: 小简铺子 | 来源:发表于2017-10-07 17:25 被阅读288次

    源码的编译-Why?

    Fabric源码的编译是建立在已经基本掌握了Fabric的部分模块或者很多模块的代码的基础上.但是为什么要编译Fabric的源码呢,大神们不是已经写好了Fabric这个项目框架并编译好了吗,拿来用不就好了吗?

    1.部署Fabric网络的docker容器是通过编译Fabric里的peer/Order/fabric-ca/模块的代码形docker镜像创建的.固有的已编译好的镜像让我们要开发的系统也禁锢住了,每个要开发的应用系统都有自身的特点,我们需要通过编译Fabric的改写的模块代码生成应用系统所需要的镜像.比如说,阿里通过基于OpenJDK定制的TaobaoVM,也是自身编译的软件开发包.
    2.编译Fabric源码可以验证自己的想法,当阅读Fabric源码时候,代码如何的运行只是通过我们理论上的猜想,通过实际的编译代码可以验证我们的猜想.
    3.定位错误,修改bug.源码的编译是建立在Fabric的源码的阅读上的,当系统运行的日志里出现错误时,根据错误提示能定位到源码中的错误点,根据源码能修改bug.

    准备工作

    1.编译环境的安装,go的安装,Fabric的源码下载,在Fabric的源码的阅读一篇中讲述了.
    2.安装其他必要的组件.
    假设GOPATH为/home/gopath该文件夹下有两个文件夹:src用于存放Fabric源码.bin用于存放go编译好的可执行文件.
    2.1安装go的包管理工具gopm.
    export GOPATH=/home/gopath
    go get -u github.com/gpmgo/gopm
    /home/gopath/bin目录下将有gopm,go get是下载和编译的意思
    2.2通过 gopm安装 goimports.(go代码格式化工具,自动修正import的package)
    export GOPATH=/home/gopath
    gopm get -g -d golang.org/x/tools/cmd/goimports
    再使用 go install 安装 goimports
    go install golang.org/x/tools/cmd/goimports
    /home/gopath/bin目录下将有goimports
    2.3安装 gocov(go的单元测试覆盖率检查工具)
    GOPATH=/home/gopath
    gopm get -g -d golang.org/x/tools/cover
    gopm get -g -d github.com/axw/gocov/gocov
    go install github.com/axw/gocov/gocov
    /home/gopath/bin目录下将有gocov
    2.4安装 gocov-xml
    GOPATH=/home/gopath
    gopm get -g -d github.com/AlekSi/gocov-xml
    go install github.com/AlekSi/gocov-xml
    /home/gopath/bin目录下将有 gocov-xml
    2.5安装其他组件
    yum install -y gcc libtool libltdl-dev libtool-ltdl-devel openssl

    3.Makefile文件的语法理解.
    Fabric的源码镜像是通过make按照Makefile中文件的编译规则来编译镜像的.
    简要介绍Makefile的语法规则.
    3.1 Makefile文件的一般形式.
    target ... : prerequisites ...
    command
    ...
    ...
    其中...表示多个.
    target是一个目标文件,可以是Object File,也可以是执行文件。也可以是一个标签(Label),make就不会自动去找lable后的文件的依赖性,也就不会自动执行其后所定义的命令。 需要明确使用make Label。才会执行命令。
    prerequisites是要生成target所需要的文件或是目标。
    command也就是make需要执行的命令。(任意的Shell命令)
    说明,上面的一般形式是一个文件的依赖关系.target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。特别的,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。
    3.2依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。
    3.3伪目标使用方法的终端编译命令是make lable,避免当前文件夹下也有文件叫lable。
    伪目标eg: .PHONY lable.PHONY避免同名 lable: rm *.o
    终端使用make labe,执行的操作是删除所有的.o文件.
    一般形式的eg : main.o : main.c defs.h cc -c main.c #make最后生成 main.o文件依赖于main.c defs.h两个文件,cc -c main.c执行可执行文件main.c进行编译.
    3.4 Makefile中的第一个目标会被作为其默认目标。

    How

    1.进入Fabric源码目录/home/gopath/src/hyperledger/fabric.并添加gopath的环境变量,一定要加.
    export GOPATH= /home/gopath
    sudo su
    2.编译生成 protoc-gen-go
    cd $GOPATH
    gopm get -g -d github.com/golang/protobuf/protoc-gen-go
    go install github.com/golang/protobuf/protoc-gen-go
    /home/gopath/bin出现protoc-gen-go执行文件
    3.根据Fabric源码目录下的Makefile文件中的说明.在源码目录下打开终端,根据下图1中方框的targets伪目标,选择你要编译的target,执行命令make peer/all/orderer...


    执行make命令后会在当前文件夹下生成一个build文件夹.编译后的镜像或者可运行工具都是在这个文件夹里找.

    编译peer模块的代码示例

    说明:peer网络节点启动时运行的命令是peer node start,实际上Fabric网络节点的peer docker容器中执行的便是通过Fabric源码编译的peer可执行文件来操作peer下的命令.本例中在peer节点下通过修改代码并编译来添加test命令.
    1.在/home/gopath/src/hyperledger/fabric/peer下添加test包.并在test包下创建test.go文件.

    package test
    import (
        "github.com/hyperledger/fabric/common/flogging"
        "github.com/spf13/cobra"
    )
    var logger = flogging.MustGetLogger("testCommand")
    func Cmd() *cobra.Command {
        return testCommond
    }
    var testCommond = &cobra.Command{
        Use:   "test",
        Short: "test the node.",
        Long:  `test a node that interacts with the network.`,
        Run: func(cmd *cobra.Command, args []string) {
            logger.Info("Build test by JinaWenJun----------------------")
        },
    }
    
    

    2.在/home/gopath/src/hyperledger/fabric/peer下的main.go文件中添加

        mainCmd.AddCommand(version.Cmd())
        mainCmd.AddCommand(node.Cmd())
        mainCmd.AddCommand(chaincode.Cmd(nil))
        mainCmd.AddCommand(clilogging.Cmd(nil))
        mainCmd.AddCommand(channel.Cmd(nil))
        //添加的另外一个test命令,并在前面导入包"github.com/hyperledger/fabric/peer/test"
        mainCmd.AddCommand(test.Cmd())
    

    3.在源码目录下打开终端进行编译 make peer,在/home/gopath/src/hyperledger/fabric/build/bin下将会生成可执行文件peer.将该文件拷贝到/home/gopath/bin下测试新添加的test 命令.(模拟在peer docker的容器下peer命令的执行).
    4.打开终端,执行peer test

    遇到的问题解决方案

    1.终端执行make 命令时,出现没有那个文件或目录如图,


    方法:需要在终端下添加环境变量,执行export GOPATH= /home/gopath

    2.当因为网速终端卡住时,需要将Makefile文件中的curl部分删除.手动下载相应的文件chaintool目录/build/bin下面.


    3.当出现文件找不到或者命令找不到,如图

    方法:终端执行下面两条命令,将命令复制进去
    cp $GOPATH/bin/protoc-gen-go $GOPATH/src/github.com/hyperledger/fabric/build/docker/gotools/bin/
    cp $GOPATH/bin/gocov $GOPATH/src/github.com/hyperledger/fabric/build/docker/gotools/bin/
    4.当终端make peer出现下图错误时候.

    方法:根据错误提示core/chaincode/ccproviderimpl.go:20:2:不能找到context.进入到相应的文件ccproviderimpl.go修改.

    如果在出现提示哪里不能找到"context"到指定的文件下按照上述形式修改即可.
    编译成功:
    相应的 build/bin/文件夹下有peer可执行文件.

    相关文章

      网友评论

        本文标题:Fabric源码编译及示例

        本文链接:https://www.haomeiwen.com/subject/djnjyxtx.html