设置sbt-pgp密码sbt中的全局配置

时间:2013-09-08 02:51:18

标签: scala sbt

This page建议我可以将以下内容添加到〜/ .sbt / *中的文件.sbt

pgpPassphrase := Some(Array('a', 'b', 'c'))

当我这样做时,我收到错误

~/.sbt/pgp.sbt:1: error: reassignment to val
pgpPassphrase := Some(Array('a', 'b', 'c'))
^

我不确定如何(或者我可以)覆盖SBT中的设置。

3 个答案:

答案 0 :(得分:2)

设置

通过我的设置,我有~/.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插件。

答案 1 :(得分:1)

我使用的是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

我能够让构建停止向我询问密码的 ONLY 方式是将其直接注入我的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,但它从未明确说明如何这样做(而且#&# 39;这个帖子的问题的一部分)。根据经验,在pgpPhassphrase~/.sbt中放置/设置~/.sbt/0.13不起作用。

我想我会在.settings()中搜索如何外部化build.sbt的值。但如果有人打败我,那将是值得赞赏的。

注意:显然,我们应该 NOT 将密码放在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))build.sbt进行sbt publish-signed,只需致电scala.util.Properties.envOrNone('GPG_PASSPHRASE')

值得注意的是,在scala REPL中,build.sbt确实有效(仅在 <?php session_start(); if(isset($_SESSION['answer'])) { $v11=$_SESSION['answer'];//boolean value } $q=100; $f=200; $r=300; ?> <link rel="stylesheet" type="text/css" href="../../styles/messages.css" /> <html> <table cellpadding="0" cellspacing="0" border="0"> <form action="" name = "page0" method="GET" enctype="multipart/form- data"> <tr > <td colspan= > ID </td><br> <td colspan="2" size="30"> NAME </td> <td colspan="3" size="50" > MACH </td> </tr> <tr> <td colspan=><input type="text" name="ID" class="rw" value="<?php $phpvar=$v11; echo $phpvar; ?>"></td> <td colspan="2" ><input type="text" name="NAME" class="rw" size="30" value="<?php $phpvar=$f; echo $phpvar; ?>"></td> <td colspan="2"><input type="text" name="MACH" class="rw" size="70" value="<?php $phpvar=$r; echo $phpvar; ?>"></td> </tr> <input type="submit" button class="button" value="Calculate" name="second_call" onclick= "document.write('<?php hello(); ?>');" /> </form> </table> </html> <?php function hello() { //some operation using values q, f, r echo(result); //i want this echo to work when i click submit on the previous page from where im redirecting here if v11=true } ?> 中)。

答案 2 :(得分:0)

在插件的最后一个版本中,我让它在接下来的步骤中运行。

使用的版本:

localhost:5901

首先添加下一个插件来控制环境变量:

addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")

然后在您的存储库中创建一个 .env 文件(重要的是将其添加到您的 .gitignore 中,此文件不应位于远程存储库中)

在文件中存储您的密码环境变量:

addSbtPlugin("au.com.onegeek" %% "sbt-dotenv" % "2.1.146")

然后你可以尝试再次运行,它应该可以工作。

<块引用>

重要的是要注意这不是推荐的设置,因为有人 访问您的机器可以轻松获取密码。