Sbt 的发布模型似乎不适用于 GitHub Packages,原因尚不完全清楚。 这条推文似乎暗示这是一个已知问题,或者至少不是完全出乎意料的事情。 一旦 GitHub 添加对 sbt 的支持,或者至少停止破坏它,我们将关闭此问题并正确发布工作插件。
作为记录,错误如下所示:
[info] [info] Set current project to sbt-github-packages-tests-publish (in build file:/private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/)
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT-sources.jar ...
[info] [info] Updating ...
[info] [info] Done packaging.
[info] [info] Wrote /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.pom
[info] [info] Done updating.
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT-javadoc.jar ...
[info] [info] Done packaging.
[info] [info] Packaging /private/var/folders/vm/h_lhw5wn573cw70qd6l0ljt80000gn/T/sbt_78381fbc/publish/target/scala-2.12/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.jar ...
[info] [info] Done packaging.
[info] [info] published sbt-github-packages-tests-publish_2.12 to https://maven.pkg.github.com/djspiewak/sbt-github-packages/com/codecommit/sbt-github-packages-tests-publish_2.12/0.1-SNAPSHOT/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.pom
[info] [error] java.io.IOException: Access to URL https://maven.pkg.github.com/djspiewak/sbt-github-packages/com/codecommit/sbt-github-packages-tests-publish_2.12/0.1-SNAPSHOT/sbt-github-packages-tests-publish_2.12-0.1-SNAPSHOT.jar was refused by the server: Forbidden
[info] [error] at org.apache.ivy.util.url.AbstractURLHandler.validatePutStatusCode(AbstractURLHandler.java:79)
[info] [error] at sbt.internal.librarymanagement.ivyint.GigahorseUrlHandler.upload(GigahorseUrlHandler.scala:191)
[info] [error] at org.apache.ivy.util.url.URLHandlerDispatcher.upload(URLHandlerDispatcher.java:82)
[info] [error] at org.apache.ivy.util.FileUtil.copy(FileUtil.java:150)
[info] [error] at org.apache.ivy.plugins.repository.url.URLRepository.put(URLRepository.java:84)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$LocalIfFileRepo.put(ConvertResolver.scala:366)
[info] [error] at org.apache.ivy.plugins.repository.AbstractRepository.put(AbstractRepository.java:130)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$ChecksumFriendlyURLResolver.put(ConvertResolver.scala:118)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$ChecksumFriendlyURLResolver.put$(ConvertResolver.scala:105)
[info] [error] at sbt.internal.librarymanagement.ConvertResolver$$anonfun$defaultConvert$lzycompute$1$PluginCapableResolver$1.put(ConvertResolver.scala:165)
[info] [error] at org.apache.ivy.plugins.resolver.RepositoryResolver.publish(RepositoryResolver.java:216)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$5(IvyActions.scala:497)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$5$adapted(IvyActions.scala:496)
[info] [error] at scala.collection.TraversableLike$WithFilter.$anonfun$foreach$1(TraversableLike.scala:788)
[info] [error] at scala.collection.Iterator.foreach(Iterator.scala:937)
[info] [error] at scala.collection.Iterator.foreach$(Iterator.scala:937)
[info] [error] at scala.collection.AbstractIterator.foreach(Iterator.scala:1425)
[info] [error] at scala.collection.IterableLike.foreach(IterableLike.scala:70)
[info] [error] at scala.collection.IterableLike.foreach$(IterableLike.scala:69)
[info] [error] at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
[info] [error] at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:787)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.publish(IvyActions.scala:496)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$3(IvyActions.scala:144)
[info] [error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.withChecksums(IvyActions.scala:157)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.withChecksums(IvyActions.scala:151)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$1(IvyActions.scala:144)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.$anonfun$publish$1$adapted(IvyActions.scala:134)
[info] [error] at sbt.internal.librarymanagement.IvySbt$Module.$anonfun$withModule$1(Ivy.scala:239)
[info] [error] at sbt.internal.librarymanagement.IvySbt.$anonfun$withIvy$1(Ivy.scala:204)
[info] [error] at sbt.internal.librarymanagement.IvySbt.sbt$internal$librarymanagement$IvySbt$$action$1(Ivy.scala:70)
[info] [error] at sbt.internal.librarymanagement.IvySbt$$anon$3.call(Ivy.scala:77)
[info] [error] at xsbt.boot.Locks$GlobalLock.withChannel$1(Locks.scala:95)
[info] [error] at xsbt.boot.Locks$GlobalLock.xsbt$boot$Locks$GlobalLock$$withChannelRetries$1(Locks.scala:80)
[info] [error] at xsbt.boot.Locks$GlobalLock$$anonfun$withFileLock$1.apply(Locks.scala:99)
[info] [error] at xsbt.boot.Using$.withResource(Using.scala:10)
[info] [error] at xsbt.boot.Using$.apply(Using.scala:9)
[info] [error] at xsbt.boot.Locks$GlobalLock.ignoringDeadlockAvoided(Locks.scala:60)
[info] [error] at xsbt.boot.Locks$GlobalLock.withLock(Locks.scala:50)
[info] [error] at xsbt.boot.Locks$.apply0(Locks.scala:31)
[info] [error] at xsbt.boot.Locks$.apply(Locks.scala:28)
[info] [error] at sbt.internal.librarymanagement.IvySbt.withDefaultLogger(Ivy.scala:77)
[info] [error] at sbt.internal.librarymanagement.IvySbt.withIvy(Ivy.scala:199)
[info] [error] at sbt.internal.librarymanagement.IvySbt.withIvy(Ivy.scala:196)
[info] [error] at sbt.internal.librarymanagement.IvySbt$Module.withModule(Ivy.scala:238)
[info] [error] at sbt.internal.librarymanagement.IvyActions$.publish(IvyActions.scala:134)
[info] [error] at sbt.Classpaths$.$anonfun$publishTask$4(Defaults.scala:2416)
[info] [error] at sbt.Classpaths$.$anonfun$publishTask$4$adapted(Defaults.scala:2416)
[info] [error] at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[info] [error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[info] [error] at sbt.std.Transform$$anon$4.work(System.scala:67)
[info] [error] at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[info] [error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[info] [error] at sbt.Execute.work(Execute.scala:278)
[info] [error] at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[info] [error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[info] [error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[info] [error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info] [error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[info] [error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info] [error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[info] [error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[info] [error] at java.lang.Thread.run(Thread.java:748)
如果你往顶部看,你会看到 pom 成功发布,但是第一个 jar 文件被Forbidden
拒绝。 @alexarchambault报告发布的顺序无关紧要,并且无论如何都会拒绝 jar。
据我所知,不支持 -sources、-javadoc、-tests
使用 sbt-aether-deploy,我已成功从 sbt 发布到 github 包
项目/plugins.sbt
addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.23.0")
addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.0.0")
构建.sbt
externalResolvers += "GitHub lokkju Apache Maven Packages" at "https://maven.pkg.github.com/lokkju/github-action-sbt"
publishTo := Some("GitHub lokkju Apache Maven Packages" at "https://maven.pkg.github.com/lokkju/github-action-sbt")
credentials += Credentials("GitHub Package Registry", "maven.pkg.github.com", "lokkju", "<GITHUB_TOKEN>")
// GitHub package repo isn't supporting javadoc and sources
publishArtifact in (Compile, packageDoc) := false
publishArtifact in (Compile, packageSrc) := false
sbt aetherDeploy
另一个方面; 如果我使用 Charles Web 调试代理,一切正常。 没有它,我偶尔会收到有关服务器无法响应的错误。
@lokkju嗯,多模块构建呢?
我没试过; 这里的关键似乎是使用 aether-deploy,尽管它并没有完全解决它。 我怀疑这是每个工具使用的客户端版本中的 SSL 支持的问题。
我将尝试几个不同的 java http 库,看看我是否可以替换一个简单的工作和不工作的配置。 我会及时通知你的。
所以,经过更多的探索,我发现了一些有趣的症状。
只是使用 curl 尝试上传包,我发现;
当前的关键点是您必须先上传 JAR 工件,然后发布 POM。
我有一封支持支持的电子邮件,我们会看看他们是否提供更多信息。
嗯,所以也没有工件签名,那么?
它会为任何上传的文件自动生成 *.md5 和 *.sha1。
另外,发现这个: https ://github.com/sbt/librarymanagement/blob/d09f9f81b664baaac15054730fbcb51e1b240de2/ivy/src/main/scala/sbt/internal/librarymanagement/IvyActions.scala#L123
Artifactory deals with the publishing (and republishing) of SNAPSHOTs using a strict rule on the order of publishing. The ;build.timestamp=... suffix is the alternative.
The strict rule is:
publish the main artefact (which has no classifier)
publish the POM/ivy.xml file
publish additional artefacts which have a classifier
到目前为止,我似乎根本无法部署分类器,这很麻烦,也是我对 github 有疑问的一部分。
我可能会创建一个纯 maven/java 项目,然后看看它是否有效
刚刚尝试使用默认发布部署快照并得到以下信息:
[error] stack trace is suppressed; run last publish for the full output
[error] (publish) java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/3.24.0-SNAPSHOT/utils-3.24.0-SNAPSHOT.pom failed with status code 400: Bad Request
文档中没有提到快照
事实上,我对普通包裹也有同样的看法:
java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/utils/0.0.1/utils-0.0.1.pom failed with status code 400: Bad Request
[error] java.io.IOException: PUT operation to URL https://maven.pkg.github.com/company/foo/bar/utils/utils/0.0.1/utils-0.0.1.pom failed with status code 400: Bad Request
[error] at org.apache.ivy.util.url.AbstractURLHandler.validatePutStatusCode(AbstractURLHandler.java:82)
[error] at org.apache.ivy.util.url.BasicURLHandler.upload(BasicURLHandler.java:264)
[error] at org.apache.ivy.util.url.URLHandlerDispatcher.upload(URLHandlerDispatcher.java:82)
[error] at org.apache.ivy.util.FileUtil.copy(FileUtil.java:150)
我想知道那400的身体是什么样子的
有这方面的更新吗?
还没有更新! 我认为@lokkju的实验是最新的。 我想多玩一些,但老实说,听起来 GitHub Packages 仍然不支持托管文件,这些文件是标准 Maven 可分发的一部分(例如签名、文档和分类器)。 在他们纠正这些缺陷之前,很难用它作为工件宿主做任何实际的事情。
更多信息,使用普通sbt 1.3.2
进行测试(没有额外的插件)
您需要发布到项目的存储库:
publishTo := Some("GitHub Package Registry" at "https://maven.pkg.github.com/[username]/[project]")
credendtails 应该这样定义
credentials += Credentials("GitHub Package Registry","maven.pkg.github.com","[username]","[token]")
您的令牌需要以下范围: read:packages
、 repo
和write:packages
但是一旦你发布,你最终会得到这些建议的包坐标(其中 organization="io.test" 和 name="test"):
<dependency>
<groupId>com.github.[username]/[project]</groupId>
<artifactId>io.test.test_2.13</artifactId>
<version>0.1</version>
</dependency>
可以上传快照,但它们可能没有特殊处理,因为您不能两次上传它们
Pom 上传工作,但其余的失败:
[信息] 将 test_2.13 发布到https://maven.pkg.github.com/ [用户名]/[项目]/io/test/test_2.13/0.0.3/test_2.13-0.0.3.pom
[错误] java.io.IOException:访问 URL https://maven.pkg.github.com/ [用户名]/[项目]/io/test/test_2.13/0.0.3/test_2.13-0.0。 3.jar 被服务器拒绝:Forbidden response=Error: "io.test.test_2.13" 0.0.3 版本中的"test_2.13-0.0.3.jar" 已经发布。
@francisdb JAR 上传失败,因为 SBT 上传文件乱序; 据我所知,这是 SBT (IvyActions.scala) 中的一个长期存在的错误,其中发布函数使用 map 类型而不是 seq 类型。 随着迁移到 Coursier 依赖管理系统,这可以自行解决。
我的建议是在这个插件中覆盖上传过程本身,确保首先上传 pom。 当然,这仍然对分类器没有帮助,我需要支持。
看起来像在 sbt 1.3.2 Coursier 没有用于上传工件,仅用于下载
此外,我还没有收到 GitHub 对此问题的任何回复
嗯...我只是快速浏览了一下。 sbt 1.2.8 仍然在这里使用:
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/build.sbt#L28
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/src/sbt-test/sbtghpackages/publish/project/build.properties#L1
https://github.com/djspiewak/sbt-github-packages/blob/0839b97dea06100a202f2a105cbe83873784bf77/project/build.properties#L1
(也许错过了一些)
我猜这些需要升级?
拉取请求:#2
仅从 sbt 1.3.0 开始默认使用 Coursier
我的测试是用1.3.2
@francisdb知道了。
看起来 Github 已经改变了一些东西,今天可以进行完整的上传。 (香草 sbt 1.3.3)
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.pom
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9.jar
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-sources.jar
[info] published test_2.13 to https://maven.pkg.github.com/francisdb/foo/com/example/test_2.13/0.0.9/test_2.13-0.0.9-javadoc.jar
web ui 仍然对 sbt 后缀感到困惑
<dependency>
<groupId>com.example.test_2</groupId>
<artifactId>13</artifactId>
<version>0.0.9</version>
</dependency>
这真让人兴奋! 我今天要做一些测试,看看我是否可以关闭它。 非常非常令人兴奋。
我可以确认,通过对插件进行一些调整以使用@francisdb的实验结果,现在一切正常! 交叉构建后缀的 webui 问题似乎不会影响实际分辨率,只会影响 UI。 因此,发布和解析现在可以使用该插件。 我还没有用私有存储库测试过东西; 我的猜测是它们还没有完全工作,但事情已经足够好了,我已经发布了0.1.0 。
谢谢大家,感谢你们所有的辛勤工作和实验! 感谢你们所有人,该插件非常简单。
@francisdb
可以上传快照,但它们可能没有特殊处理,因为您不能两次上传它们
您可以_上传两次:您可以在 GitHub UI 中删除快照,然后再次上传新快照(即相同的快照版本)。 这对我有用。 有点麻烦,但它确实有效。
最有用的评论
看起来 Github 已经改变了一些东西,今天可以进行完整的上传。 (香草 sbt 1.3.3)
web ui 仍然对 sbt 后缀感到困惑