使用 sbt-native-packager 发布到 bintray 一个 zip 文件

Posted

技术标签:

【中文标题】使用 sbt-native-packager 发布到 bintray 一个 zip 文件【英文标题】:Publish to bintray a zip file with sbt-native-packager 【发布时间】:2014-07-06 07:17:28 【问题描述】:

我想使用 sbt-native-launcher 将 zip 文件发布到 bintray。

我能够执行:

sbt publish

它会发布主要的工件(.jar、javadocs 等)。

我也能执行:

sbt universal:packageBin

它会生成 .zip 文件。

但是,当我执行时:

sbt universal:publish

它给出了以下错误:

[info] Wrote C:\src\ShExcala\target\scala-2.10\shexcala_2.10-0.0.1.pom
tar: Cannot execute remote shell: No such file or directory
tar: C\:\\Users\\Labra\\AppData\\Local\\Temp\\sbt_407249ba\\shexcala-0.0.1.tar: Cannot open: I/O error
tar: Error is not recoverable: exiting now
[trace] Stack trace suppressed: run last universal:packageZipTarball for the full output.
[error] (universal:packageZipTarball) Error tarballing
C:\src\ShExcala\target\universal\shexcala-0.0.1.tgz. Exit code: 2

似乎问题出在“universal:packageZipTarball”任务上,它也给出了同样的错误。

我使用的是 Windows,并且我检查了我是否安装了“tar”、“xz”和“gzip”。

我现在不介意只发布 .zip,所以也许另一种解决方法就是知道如何配置 sbt-native-packager 以避免 packageZipTarball 任务。

build.sbt 的定义是:

import sbt._
import sbt.Keys._
import AssemblyKeys._
import bintray.Plugin.bintraySettings
import bintray.Keys._
import scala.scalajs.sbtplugin.ScalaJSPlugin.ScalaJSKeys._

lazy val root = project.in(file("."))//.settings(crossScalaVersions := Seq("2.10.4", "2.11.0"))

Build.sharedSettings

version := Build.currentVersion

libraryDependencies ++= Seq(
    "org.specs2" %% "specs2" % "2.3.7" % "test" 
  , "org.scalatest" % "scalatest_2.10" % "2.0.1-SNAP" % "test"
  , "commons-configuration" % "commons-configuration" % "1.7"
  , "org.rogach" %% "scallop" % "0.9.5" 
  , "com.typesafe" % "config" % "1.0.1"
  , "org.scala-lang" % "scala-compiler" % "2.10.2" 
  , "com.assembla.scala-incubator" % "graph-core_2.10" % "1.6.2"
  , "org.apache.jena" % "jena-arq" % "2.10.1" 
  , "org.scalaz" % "scalaz-core_2.10" % "7.0.6" 
  , "es.weso" % "stateparser_2.10" % "0.0.1"
  , "es.weso" % "wesin_2.10" % "0.0.1" 
  )

autoCompilerPlugins := true

seq(bintraySettings:_*)

Build.publishSettings

deploymentSettings

publishMavenStyle := true

// publish <<= publish.dependsOn(publish in config("universal"))

packageArchetype.java_application

resourceGenerators in Test += Def.task 
  val location = url("https://github.com/shexSpec/test-suite/raw/gh-pages/tests.zip")
  IO.unzipURL(location, resourceManaged.value / "downloadedTests").toSeq
.taskValue

resolvers ++= Seq("snapshots", "releases").map(Resolver.sonatypeRepo)

project/build.scala 是:

import sbt._
import sbt.Keys._
import bintray.Plugin.bintraySettings
import bintray.Keys._
import Def.ScopedKey
import scala.scalajs.sbtplugin.ScalaJSPlugin._

object Build extends sbt.Build 

  val isRelease = true 

  def repo = "weso-releases" 

  val shExcalaVersion = "0.0.1"

  publishMavenStyle := false

  val currentVersion = shExcalaVersion

  protected val bintrayPublishIvyStyle = settingKey[Boolean]("=== !publishMavenStyle")   

  lazy val publishSettings = Seq(
    repository in bintray := this.repo,
    bintrayOrganization in bintray := Some("weso"),
    licenses += ("MPL-2.0", url("http://opensource.org/licenses/MPL-2.0")),
    bintrayPublishIvyStyle := true
  )

 val sharedSettings = Seq(
    organization := "es.weso",
    name := "shExcala",
    scalaVersion := "2.10.4"
 )
 

last universal:packageZipTarball 的输出是:

> last universal:packageZipTarball
java.lang.RuntimeException: Error tarballing C:\src\ShExcala\target\universal\shexcala-0.0.1.tgz. Exit code: 2
        at scala.sys.package$.error(package.scala:27)
        at com.typesafe.sbt.packager.universal.Archives$$anonfun$makeTarball$1.apply(Archives.scala:134)
        at  com.typesafe.sbt.packager.universal.Archives$$anonfun$makeTarball$1.apply(Archives.scala:118)
        at sbt.IO$.withTemporaryDirectory(IO.scala:285)
        at com.typesafe.sbt.packager.universal.Archives$.makeTarball(Archives.scala:118)
        at com.typesafe.sbt.packager.universal.Archives$$anonfun$10.apply(Archives.scala:111)
        at com.typesafe.sbt.packager.universal.Archives$$anonfun$10.apply(Archives.scala:111)
        at scala.Function3$$anonfun$tupled$1.apply(Function3.scala:35)
        at scala.Function3$$anonfun$tupled$1.apply(Function3.scala:34)
        at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
        at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
        at sbt.std.Transform$$anon$4.work(System.scala:64)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
        at sbt.Execute.work(Execute.scala:244)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
        at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
        at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
[error] (universal:packageZipTarball) Error tarballing     C:\src\ShExcala\target\universal\shexcala-0.0.1.tgz. Exit code: 2
>

【问题讨论】:

您能否分享您的构建定义以及在universal:publish 失败后执行的last universal:packageZipTarball 的输出 我编辑了添加 build.sbt 和 project/build.scala 文件的问题 您能否也添加您的tar --versiongzip --version 的输出。此外,您能否确认您的目录/工件名称中没有空格? tar 版本是 (tar (GNU tar) 1.13),gzip 版本是 (gzip 1.2.4 (18 Aug 93)。我认为我的目录/工件名称中没有空格。 ..我怎么确认? 这不是一个真正的解决方案,但我认为问题可能与 tar 如何处理 Windows 上的绝对路径有关。 sbt-native-packager 所做的是执行tar -pcvf C:\\.... destdir,当我尝试在 Windows 上运行它时失败了。 【参考方案1】:

我认为问题在于 Windows 的 tar,它不接受绝对路径。 sbt-native-packager 所做的是执行tar -pcvf &lt;absolute-path&gt; &lt;input&gt;

我不确定您是否可以轻松禁用 universal:packageZipTarball 任务。

不过,我可以提出一个解决方法。安装bsdtar,貌似没有这个问题,仍然可以调用gnu tar。从链接下载文件,安装gnutar,安装后到C:\Program Files\GnuWin32\bin复制bsdtar.exetar.exe。 p>

确保tar 命令在您的PATH 变量中。

【讨论】:

谢谢...它似乎工作。至少,如果我执行universal:packageZipTarball,它会生成.tgz。但是,如果我执行universal:publish sbt 就会挂断。我尝试了universal:packageBinpublish,它们按预期工作。

以上是关于使用 sbt-native-packager 发布到 bintray 一个 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 sbt-native-packager 时的模糊参考

任何使用 sbt-native-packager 的好例子

扩展 sbt-native-packager (Docker)

使用 sbt-native-packager 通过 JavaServerAppPackaging 检测 prometheus 导出器

使用 sbt-native-packager 时的配置目录

使用 sbt-native-packager 构建 docker 包时重复映射