当前位置: 首页 > 知识库问答 >
问题:

如何为多项目设置环境变量?

郭元凯
2023-03-14

我有sbt多项目,并尝试在子项目的build.sbt中设置envVars如下:

envVars in Test := Map("KAFKA_SERVER" -> "localhost:9092")

测试将中止,并显示以下消息:

[info]   java.util.NoSuchElementException: None.get
[info]   at scala.None$.get(Option.scala:349)
[info]   at scala.None$.get(Option.scala:347)
[info]   at io.khinkali.auth.AppSpec.<init>(AppSpec.scala:23)
[info]   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  

在测试文件中,我试图得到如下值:

sys.env.get("KAFKA_SERVER").get  

Intellj提供如下设置环境变量:

如何设置一个环境变量在sbt子项目也?
更新

build。sbt如下所示:

name := "bary"

scalacOptions += "-Ypartial-unification"
scalacOptions += "-feature"
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)


val Cats = "1.0.0"
val Shiro = "1.4.0"
val Logback = "1.2.3"
val CatsEffect = "0.5"
val Kafka = "1.0.0"
val Bean = "1.9.3"
val Circe = "0.9.0-M3"
val Log4j = "1.7.25"
val ScalaCheck = "1.13.4"
val Scalactic = "3.0.4"
val Scalatest = "3.0.4"
val JavaJwt = "3.3.0"
val Simulacrum = "0.11.0"
val Http4s = "0.18.0-M7"


lazy val commonSettings = Seq(
  organization := "io.khinkali",
  version := "0.1.0-SNAPSHOT",
  scalaVersion := "2.12.4",
  envVars in Test := Map("KAFKA_SERVER" -> "localhost:9092"),
  fork in Test := true,
  libraryDependencies ++= Seq(
    "org.slf4j" % "slf4j-simple" % Log4j,
    "ch.qos.logback" % "logback-core" % Logback,
    "org.apache.shiro" % "shiro-all" % Shiro,
    "org.typelevel" %% "cats-core" % Cats,
    "org.typelevel" %% "cats-effect" % CatsEffect,
    "org.apache.kafka" % "kafka-streams" % Kafka,
    "org.apache.kafka" % "kafka-clients" % Kafka,
    "commons-beanutils" % "commons-beanutils" % Bean,
    "io.circe" %% "circe-core" % Circe,
    "io.circe" %% "circe-generic" % Circe,
    "io.circe" %% "circe-parser" % Circe,
    "io.circe" %% "circe-literal" % Circe,
    "com.github.mpilquist" %% "simulacrum" % Simulacrum,

    "org.scalactic" %% "scalactic" % Scalactic,
    "org.scalatest" %% "scalatest" % Scalatest % "test",
    "org.scalacheck" %% "scalacheck" % ScalaCheck % "test",
  ),
  resolvers ++= Seq(
    "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
  ),
  fork in run := true,
)

lazy val root = (project in file("."))
  .settings(commonSettings)
  .settings(
    name := "bary",
    organization := "io.khinkali",
    moduleName := "bary"
  ).
  aggregate(
    kafka_api,
    auth_stream,
    rest)

lazy val kafka_api = (project in file("kafka-api")).
  settings(commonSettings).
  settings(
    name := "kafka-api",
    moduleName := "kafka-api"
  )

lazy val auth_stream = (project in file("auth-stream")).
  settings(commonSettings).
  settings(
    name := "auth-stream",
    moduleName := "auth-stream",
    libraryDependencies ++= Seq(
      "com.auth0" % "java-jwt" % JavaJwt,
    )
  ).dependsOn(kafka_api)

lazy val rest = (project in file("rest")).
  settings(commonSettings).
  settings(
    name := "rest",
    moduleName := "rest",
    libraryDependencies ++= Seq(
      "org.http4s" %% "http4s-dsl" % Http4s,
      "org.http4s" %% "http4s-blaze-server" % Http4s,
      "org.http4s" %% "http4s-blaze-client" % Http4s,
      "org.http4s" %% "http4s-circe" % Http4s,
    )
  ).dependsOn(kafka_api, auth_stream)

我还是有例外。

共有1个答案

方博
2023-03-14

要应用于子项目的任何设置都可以仅为该子项目指定,也可以在公共设置中指定,如下面的build.sbt所示。

您没有显示多项目定义,所以这里有一个简短的例子。设立这类项目的方法有很多,我不打算详细说明可能的方法;这是一个复杂的话题,多年来,尤其是最近,它已经发展了很多。

lazy val commonSettings = Seq(
  envVars in Test := Map("KAFKA_SERVER" -> "localhost:9092"),
  fork in Test := true, // required for envVars task to work
  javacOptions ++= Seq(
    "-Xlint:deprecation",
    "-Xlint:unchecked",
    "-source", "1.8",
    "-target", "1.8",
    "-g:vars"
  ),
  licenses += ("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0.html")),
  version := "0.5.0"
)

lazy val demo = project
  .settings(commonSettings:_*)
  .settings(
    name := "demo"
  ).dependsOn(root)

lazy val root = (project in file("root"))
  .settings(commonSettings:_*)
  .settings(
    name := "root"
  )

还有一个重要的事实:使用IntelliJ IDEA测试运行程序运行时,不尊重test的环境设置。作为一种解决方法,您可以在运行/调试配置中设置环境变量-

通常,将环境变量应用于流程的唯一方法是使用该环境变量启动流程。如果您希望SBT在具有特定环境变量的环境中运行您的程序,则需要在新的环境中启动它。这叫做分叉。

 类似资料:
  • 问题内容: 我开始研究一个项目,它使用了Github私有存储库中的一些私有模块,每当我尝试运行它时,都会出现以下错误: 验证github.com/repoURL/go- proto@v2.86.0+incompatible/go.mod:github.com/repoURL/go- proto@v2.86.0+incompatible/go.mod:阅读https://sum.golang。 or

  • 问题内容: 我的视图中有三个按钮。在viewDidLoad()中设置cornerRadus之后:我在日志中收到以下错误消息: 问题: 如何设置CG_CONTEXT_SHOW_BACKTRACE环境变量? 或者如何解决此警告? 好吧,现在我已经从消息中得到了回溯。这对我来说没有任何意义。请帮忙… 问题答案: 这是9b5中的错误:https://forums.developer.apple.com/t

  • bash_profile像这样 当我给出时,我遇到了这个错误 错误:在Android SDK中找不到gradle包装器。可能需要更新Android SDK。看这里: /Users/subbarao/Library/Android/sdk/tools/templates/gradle/wrapper

  • 问题内容: 我使用martini在Go中有一个GAE应用程序。我需要能够设置环境变量以告诉martini它应该使用生产设置进行初始化。根据Python文档,您可以在app.yaml中设置环境变量。我没有在Go docs中 看到任何有关此的内容,但我猜想它应该可以正常工作。 我需要能够将环境变量设置为,但是我只想在实际投入生产时(即)进行操作。有什么方法可以告诉您仅在非开发服务器上运行吗? 问题答案

  • 问题内容: 如何从Java设置环境变量?我看到我可以使用来对子流程执行此操作ProcessBuilder。不过,我有几个子流程要启动,所以我宁愿修改当前流程的环境,并让这些子流程继承它。 有一个获取单个环境变量的方法。我还可以使用获取Map完整的环境变量集。但是,调用put()该方法Map将引发-显然,这意味着该环境是只读的。而且,没有。 那么,有什么方法可以在当前运行的进程中设置环境变量?如果是

  • 问题内容: 我不想每次运行gulp设置环境变量时都键入额外的参数。 我宁愿 通过任务从gulp中 设置环境变量。 什么是实现这一目标的好方法? 问题答案: 像这样使用它: