如何在build.sbt中使用环境变量?

时间:2017-04-27 14:04:06

标签: scala sbt

我想在使用built.sbt时使用环境变量来传递我的repo凭据。

我尝试过这样的事情,但细节还没有找到。

credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", System.getenv("USERNAME"), System.getenv("PASSWORD"))

我还尝试了〜/ .sbt /下的凭证文件,但我不知道如何添加环境变量。

如果我只是在凭证文件中正常输入我的用户名和密码,那么我就知道登录的详细信息是正常的。

其他: 我在运行sbt compile之前在shell中获取环境变量。

正在运行

credentials += Credentials("Realm", "my.artifact.repo.net", sys.env("USERNAME"), sys.env("PASSWORD"))

导致禁止的网址错误。

我应该说我试图解决依赖关系

更新: 以下内容返回正确的值

eval scala.sys.env("ARTIFACTORY_USERNAME")

但是当我将其添加到我的脚本中时

val username = scala.sys.env("ARTIFACTORY_USERNAME")
val password = scala.sys.env("ARTIFACTORY_PASSWORD")
credentials += Credentials("Artifactory Realm", "artifactory.link.io", username, password)

resolvers ++= Seq(
"Artifactory Snapshot" at "https://artifactory.link.io/art/libs-snapshot"
)

credentials += Credentials("Artifactory Realm", "my.artifact.repo.net", sys.env("ARTIFACTORY_USERNAME"), sys.env("ARTIFACTORY_PASSWORD"))   

我收到一个FORBIDDEN URL错误,表明scala部分运行正常,但由于某种原因,凭据仍然不正确。如果我在build.sbt中明确设置了凭据,那就可以了。

6 个答案:

答案 0 :(得分:8)

您可以使用其他响应中提到的命令获取env变量,例如:

sys.env.get("USERNAME")
sys.env.get("PASSWORD")

但它们会返回Option [String]

类型的选项

要将其转换为字符串,您需要进行匹配或只需使用

sys.env.get("USERNAME").get
sys.env.get("USERNAME").getOrElse("some default value")

如果您需要设置一些默认值。警告!调用没有值的选项的.get会给你一个运行时错误。

答案 1 :(得分:7)

您可以在sbt中使用在Scala中有效的任何内容,例如:

sys.env.get("PASSWORD")

答案 2 :(得分:2)

将代码添加到示例中,发送用户ID和密码的凭据字符串:

(sys.env.get("USERNAME"), sys.env.get("PASSWORD")) match {
  case (Some(username), Some(password)) => 
    println(s"Do my thing $username/$password")
    credentials += Credentials("Realm", "my.artifact.repo.net", username, password)
  case _ => 
    println("USERNAME and/or PASSWORD is missing")
    credentials ++= Seq()
}

答案 3 :(得分:1)

通过sys.env("VARIABLE")System.getenv("VARIABLE")获取环境变量,如果正确导出,则都可以在build.sbt中使用。

您可能需要正确设置凭据(general instructions)。

对于Artifactory,它应该如下所示:

publishTo := Some("Artifactory Realm" at "http://<host>:<port>/artifactory/<repo-key>")
credentials += Credentials("Artifactory Realm", "<host>", "<USERNAME>", "<PASS>")

请注意,此处的“Artifactory Realm”不是任意字符串,实际上必须完全符合规定。

完整说明:https://www.jfrog.com/confluence/display/RTF/SBT+Repositories

答案 4 :(得分:1)

您也可以使用

val config :Config = ConfigFactory.load()
val username=config.getString(“USERNAME”)
val password = config.getString(“PASSWORD”)

答案 5 :(得分:0)

(sys.env.get("USERNAME"), sys.env.get("PASSWORD")) match ...不适用于sbt 1.1.1。

JFrog的替代解决方案,这是github上的可行示例

https://github.com/jfrog/project-examples/tree/master/circleci-example/circleci-sbt-artifactory

在项目的根目录而不是credentials.properties上创建一个~/.sbt/credentials文件。将其添加到.gitignore

cat <<EOF > credentials.properties
realm=Artifactory Realm
host=gcartifactory-us.jfrog.info
user=$ARTIFACTORY_USERNAME
password=$ARTIFACTORY_PASSWORD
EOF

在生成之前生成文件,并在您的文件中对其进行引用 build.sbt

credentials += Credentials(new File("credentials.properties"))