1. 程式人生 > >ScalaPB(4): 通用跨系統protobuf數據,sbt設置

ScalaPB(4): 通用跨系統protobuf數據,sbt設置

sed ext lazy div color 保持 sub nag 文件中

我們知道,在集群環境節點之間進行交換的數據必須經過序列化/反序列化處理過程,而在這方面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"

ScalaPB(4): 通用跨系統protobuf數據,sbt設置