基本認証が必要なNexusリポジトリマネージャーにアクセスしようとしています。すべてがMaven2で正常に機能しますが、SBTで設定しようとしても、アーティファクトが見つかりません。カスタムリポジトリパターンを使用しています( この関連する質問 を参照)が、それは問題ではないと思います。いずれにせよ、関連する構成はこちらです。
Project.scala:
val snapshotsName = "Repository Snapshots"
val snapshotsUrl = new Java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots")
val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]"
val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern))
Credentials(Path.userHome / ".ivy2" / ".credentials", log)
val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3")
〜/ .ivy2/.credentials:
realm=Snapshots Nexus
Host=nexusHostIp:8081
user=nexususername
password=nexuspassword
SBTユーザーグループでの同様の議論 によると、これはうまくいくはずですが、ビルドしようとすると次のようになります。
==== Repository Snapshots: tried
[warn] -- artifact group#artifact;0.0.1!artifact.jar:
[warn] http://nexusHostIp:8081/nexus/content/repositories/snapshots/group/artifact/0.0.1-SNAPSHOT/artifact-0.0.1-20101202.195418-3.jar
これは資格情報の問題であり、他の何かではないことはかなり確信しています.
また、資格情報をインラインで宣言しようとしました(理想的ではありませんが)。
Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
私がやったことは次のとおりです(sbt 0.13 +アーティファクト-ネクサスのセットアップは似ているはずです):
1)〜/ .sbt/repositoriesファイルをここで指定されているとおりに編集しました: http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Proxy-Repositories.html
[repositories]
local
my-ivy-proxy-releases: http://repo.company.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
my-maven-proxy-releases: http://repo.company.com/maven-releases/
2)匿名アクセスを無効にするためにアーティファクトをロックしました。
3)〜/ .sbt/.credentialsに資格情報ファイルを作成しました
realm=Artifactory Realm
Host=artifactory.mycompany.com
user=username
password=password
4)〜/ .sbt/0.13/plugins/credentials.sbtの下にデフォルトの資格情報を結び付けるファイルを作成しました
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
これで、私のプロジェクトがsbtをロードすると、通常のようにアーティファクトがヒットします。
このようにした理由は、リポジトリの定義などをプロジェクトファイルに入れないようにして、チームに柔軟性を持たせることです(進行中のアーティファクトなどを処理するために内部サーバーをセットアップできます)。
-オースティン
更新:この回答は最近のsbtバージョンでは機能しません。代わりにオースティンの回答を参照してください。
さて、私はついにこれを整理しました。
snapshotsName
は任意です。 .credentialsのrealm
は、リポジトリ(私の場合はネクサス)のURLにアクセスしようとしたときに表示されるHTTP認証領域でなければなりません。 realm
は、Credentials.add
の最初のパラメーターでもあります。その行は
Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")
ホスト名は、単にIPまたはDNS名です。 .credentialsでは、Host
はポート番号なしのnexusHostIp
にすぎません。
したがって、作業中のプロジェクト構成は次のとおりです。
val snapshotsName = "Repository Snapshots"
val snapshotsUrl = new Java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots")
val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]"
val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern))
Credentials(Path.userHome / ".ivy2" / ".credentials", log)
val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3")
次のような.credentialsファイルを使用します。
realm=Sonatype Nexus Repository Manager
Host=nexusHostIp
user=nexususername
password=nexuspassword
「Sonatype Nexus Repository Manager」はHTTP認証レルムです。
SBTランチャーがプロキシからの新しいバージョンのSBTのダウンロードに失敗し、~/.sbt/boot/update.log
が401認証エラーを受け取っていることを示している場合、環境変数SBT_CREDENTIALSを使用してivy資格情報ファイルの場所を指定できます。
これらのいずれかが動作し、新しいsbtバージョンをダウンロードする必要があります。
SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"
を.bashrc
(または.zshrc
)に入れて、新しいシェルセッションを開始してからsbt
を実行します(ここに示されている他の回答のような~/.ivy2/.credentials
ファイルのセットアップが必要です)
ソース: https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b
SBT Documetation の後に:
このようなリポジトリの資格情報を指定するには、2つの方法があります。
credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", "admin", "password123")
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
資格情報ファイルは、キーレルム、ホスト、ユーザー、およびパスワードを含むプロパティファイルです。例えば:
realm=Some Nexus Repository Manager
Host=my.artifact.repo.net
user=admin
password=password123
これは私のために働いた。私はSBTバージョン0.13.15を使用しています:
~/.ivy2/.my-credentials
(ポートのないホスト):
realm=Sonatype Nexus Repository Manager
Host=mynexus.mycompany.com
user=my_user
password=my_password
build.sbt
(ポートを含むネクサスURL):
import sbt.Credentials
...
credentials += Credentials(Path.userHome / ".ivy2" / ".my-credentials")
...
resolvers in ThisBuild ++= Seq(
MavenRepository("my-company-nexus", "https://mynexus.mycompany.com:8081/repository/maven-releases/")
)
資格情報を含むすべてのファイルを確認します。
私にとっては、sbt 1.0で(古き良き0.13の代わりに)新しいプロジェクトがあり、~/.sbt/1.0/global.sbt
忘れていた資格情報を含むファイル。そのため、パスワードを強制的に変更した後、アーティファクトのダウンロードが破損し、アカウントがロックされました。
資格情報のチェーンとそれらを埋めるファイルを簡単に検査できると便利です。また、SBTがもう少し慎重で、最初に認証/承認が正しいかどうかを確認してから、Xファイルのダウンロードを開始し、3回の誤認証の試行後にアカウントをロックする場合もいいでしょう。