此页面建议我可以将以下内容添加到 ~/.sbt/*.sbt 中的文件中
pgpPassphrase := Some(Array('a', 'b', 'c'))
当我这样做时,我得到了错误
~/.sbt/pgp.sbt:1: error: reassignment to val
pgpPassphrase := Some(Array('a', 'b', 'c'))
^
我不确定如何(或者如果我可以)覆盖 SBT 中的设置。
通过我的设置,我有~/.sbt/plugins/plugins.sbt
:
addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8")
和~/.sbt/global.sbt
:
pgpPassphrase := Some(Array('a', 'b', 'c'))
这可能与您已经拥有的相同。
可能还有其他问题导致 sbt-pgp 加载不正确。一种可能性是旧版本的插件仍在类路径中。尝试如下清理构建项目:
> reload plugin
> clean
> reload return
还要确保您正在加载的构建没有加载 sbt-pgp 插件。
我正在使用 sbt 0.13.11。这就是我所做的。
在~/.sbt/plugins
我添加了这个文件~/.sbt/plugins/gpg.sbt
。其内容如下。
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")
在我的项目中site.sbt
,我添加了该行。
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1")
我尝试将此行添加pgpPassphrase := Some(Array('a', 'b', 'c'))
到以下位置,但它们要么因语法而失败,要么继续提示我输入密码。
~/.sbt/global.sbt
~/.sbt/0.13/global.sbt
我能够让构建停止要求我输入密码的唯一方法是将其直接注入我的build.sbt
文件中。例如,
lazy val commonSettings = Seq(
organization := "com.something",
version := "0.0.1-SNAPSHOT",
scalaVersion := "2.10.6",
publishMavenStyle := true,
publishTo := {
val nexus = "http://nexus.something.io/"
if (isSnapshot.value)
Some("snapshots" at nexus + "content/repositories/snapshots")
else
Some("releases" at nexus + "content/repositories/releases")
},
publishArtifact in Test := false,
pomIncludeRepository := { _ => false },
pomExtra := (
<url>http://gitlab.something.io/something/project</url>
<scm>
<url>git@gitlab.something.io:something/project</url>
<connection>scm:git:git@gitlab.something.io:something/project.git</connection>
<developerConnection>scm:git:git@gitlab.something.io:something/project.git</developerConnection>
</scm>
<developers>
<developer>
<email>myemail@gmail.com</email>
<name>my name</name>
<url>https://github.com/mysite</url>
<id>myid</id>
<organization>My Org</organization>
<organizationUrl>https://github.com/me</organizationUrl>
</developer>
</developers>),
pgpPassphrase := Some(Array('a','b','c'))
)
或者,我也可以在build.sbt
.
lazy val project = (project in file("."))
.settings(commonSettings: _*)
.settings(pgpPassphrase := Some(Array('a','b','c')))
.settings(name := "my-project")
.settings(libraryDependencies ++= commonDeps)
.settings(parallelExecution in Test := false)
.settings(javaOptions ++= Seq("-Xms512M", "-Xmx2048M", "-XX:MaxPermSize=2048M", "-XX:+CMSClassUnloadingEnabled"))
我的弱点是我对 SBT 的了解不够,但是网上的文档确实说你可以创建一个文件来外部化pgpPassphrase
,但它从来没有明确说明如何做到这一点(这是这篇文章问题的一部分)。pgpPhassphrase
从经验上讲,放置/设置~/.sbt
或~/.sbt/0.13
不起作用。
我想我将寻找如何将 in 的值外部.settings()
化build.sbt
。但是,如果有人击败我,那将不胜感激。
注意:显然,我们不应该将密码短语放在 build.sbt(或 SCM 中版本控制的文件)中。
这是一种解决方法#1。
lazy val project = (project in file("."))
.settings(commonSettings: _*)
.settings(pgpPassphrase := scala.util.Properties.propOrNone("gpg.passphrase").map(_.toCharArray))
.settings(name := "my-project")
.settings(libraryDependencies ++= commonDeps)
.settings(parallelExecution in Test := false)
.settings(javaOptions ++= Seq("-Xms512M", "-Xmx2048M", "-XX:MaxPermSize=2048M", "-XX:+CMSClassUnloadingEnabled"))
有了这个,你可以调用 sbt 如下sbt -Dgpg.passphrase=abc publish-signed
:
解决方法 #2。
lazy val project = (project in file("."))
.settings(commonSettings: _*)
.settings(pgpPassphrase := Some(System.getenv("GPG_PASSPHRASE").toCharArray))
.settings(name := "my-project")
.settings(libraryDependencies ++= commonDeps)
.settings(parallelExecution in Test := false)
.settings(javaOptions ++= Seq("-Xms512M", "-Xmx2048M", "-XX:MaxPermSize=2048M", "-XX:+CMSClassUnloadingEnabled"))
使用这种方法,您必须导出密码export GPG_PASSPHRASE=abc
,然后运行sbt publish-signed
.
有趣的是,如果您导出密码,以下行不会获取该值(至少在我的环境中):.settings(pgpPassphrase := scala.util.Properties.envOrNone("GPG_PASSPHRASE").map(_.toCharArray))
我认为解决方法 #2 可能会更好,因为您可以在 bash 配置文件中导出密码。
我刚刚发现在里面build.sbt
,scala.util.Properties.envOrNone
找不到像GPG_PASSPHRASE
. 如果我只是导出这样的东西export gpg.passphrase=abc
,那么 bash 会抱怨。作为一个中间立场,如果我这样做export gpgpassphrase=abc
,那么我可以.settings(pgpPassphrase := scala.util.Properties.envOrNone("gpgpassphrase").map(_.toCharArray))
在 my中做build.sbt
并且简单地调用sbt publish-signed
。
有趣的是,在 scala REPL 中,scala.util.Properties.envOrNone('GPG_PASSPHRASE')
确实有效(只是在build.sbt
.
使用插件的最后一个版本,我让它在接下来的步骤中运行。
使用的版本:
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
首先添加下一个插件来控制环境变量:
addSbtPlugin("au.com.onegeek" %% "sbt-dotenv" % "2.1.146")
然后在你的存储库上创建一个 .env 文件(将它添加到你的 .gitignore 中很重要,这个文件不应该在远程仓库中)
在文件中存储您的密码 env 变量:
PGP_PASSPHRASE="your_passphrase_here"
然后你可以尝试再次运行,它应该可以工作。
需要注意的是,这不是推荐的设置,因为有权访问您的机器的人可以轻松获取密码。