zoukankan      html  css  js  c++  java
  • ScalaPB(4): 通用跨系统protobuf数据,sbt设置

      我们知道,在集群环境节点之间进行交换的数据必须经过序列化/反序列化处理过程,而在这方面protobuf是一个比较高效、易用的模式。用户首先在.proto文件中用IDL来定义系统中各种需要进行交换的数据类型。然后用protoc编译器自动产生相关的源代码,里面包括了完整的序列化处理函数。在一个集成的系统环境内,protobuf数据必须保持与所有系统的松散耦合,不能对这些用户系统有任何依赖。这样把protobuf数据类型和相关的序列化/反序列化函数打成一个独立的包,由用户系统各自引用就是一种最佳解决方案了。

    下面示范产生一个独立的protobuf包。build.sbt定义如下:

    import scalapb.compiler.Version.scalapbVersion
    import scalapb.compiler.Version.grpcJavaVersion
    
    name := "common-protobuf-data"
    
    version := "0.1"
    
    scalaVersion := "2.12.6"
    
    libraryDependencies ++= Seq(
      "com.thesamet.scalapb" %% "scalapb-runtime" % scalapbVersion % "protobuf",
      "io.grpc" % "grpc-netty" % grpcJavaVersion,
      "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion
    )
    
    PB.targets in Compile := Seq(
      scalapb.gen(
        flatPackage = true
      ) -> (sourceDirectory in Compile).value / "scala/generated"
    
    )

    注意我们指定把产生的源代码放在src/main/scala/generated/目录下。

    我们再随便建个.proto文件:

    syntax = "proto3";
    
    // Brought in from scalapb-runtime
    import "scalapb/scalapb.proto";
    import "google/protobuf/wrappers.proto";
    
    package proto.microservices;
    
    message Added {
    
        int32 nbr1 = 1;
        int32 nbr2 = 2;
    }
    
    message Subtracted {
        int32 nbr1 = 1;
        int32 nbr2 = 2;
    }
    
    message AddedResult {
        int32 nbr1 = 1;
        int32 nbr2 = 2;
        int32 result = 3;
    }
    
    message SubtractedResult {
        int32 nbr1 = 1;
        int32 nbr2 = 2;
        int32 result = 3;
    }

    用sbt package 产生common-protobuf-data_???.jar文件。在使用方sbt项目里可以用unmanagedBase指定.jar路径或者把包放到默认的lib/目录下:

    lazy val commonSettings = Seq(
      name := "using-common-protobuf-data",
      version := "1.0",
      scalaVersion := "2.12.6",
    )
    
    lazy val local = (project in file("."))
      .settings(commonSettings)
      .settings(
        libraryDependencies ++= Seq(
          "com.typesafe.akka"      %% "akka-remote" % "2.5.11",
          "com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf"
        ),
      )
    
    unmanagedBase := file("/users/tiger-macpro/jars/")
    
    PB.targets in Compile := Seq(
      scalapb.gen() -> (sourceManaged in Compile).value
    )

    好了。在上面的.sbt文件中有关路径的设置需要总结一下:

    1、改变默认源代码路径:   (src/main/scala, src/test/scala)

    scalaSource in Compile := baseDirectory.value / "src"
    scalaSource in Test := baseDirectory.value / "test-src"
    
    javaSource in Compile := baseDirectory.value / "src"
    javaSource in Test := baseDirectory.value / "test-src"

    2、改变默认资源路径:(src/main/resources)

    resourceDirectory in Compile := baseDirectory.value / "resources"
    resourceDirectory in Test := baseDirectory.value / "test-resources"

    3、改变默认附加库路径:(lib/)

    unmanagedBase := baseDirectory.value / "jars"
    //只在编译时引用
    unmanagedBase in Compile := baseDirectory.value / "lib" / "main"

    4、取消根目录为源代码默认路径:

    sourcesInBase := false

    5、增加一个源代码路径:

    unmanagedSourceDirectories in Compile += baseDirectory.value / "extra-src"

    6、增加一个资源路径:

    unmanagedResourceDirectories in Compile += baseDirectory.value / "extra-resources"
  • 相关阅读:
    数据访问 之 修改数据 (重要)---2017-04-27
    数据访问 之 删除操作 ------ 2017-04-27
    连接数据库的注册、登录----2017-04-26
    数据访问(创建链接、读取数据、例题)--2017-04-25
    C/S 和B/S 详解 --- 2017-04-25
    二阶段测试改错与反思(数据库+面向对象)----2017-04-24
    qq面板(仿版,未完待续中。。。。)---2017-04-24
    网站设计需要注意的20个常犯错误---2017-04-23
    数据库四大特性;
    数据库部分---查询-简单查询;
  • 原文地址:https://www.cnblogs.com/tiger-xc/p/9031143.html
Copyright © 2011-2022 走看看