Scala/Sbt の依存ライブラリ追加でパッケージが見つからないときにリゾルバーを追加したい
背景
Scala/Sbt を使ってプログラミングを開発しているとき、
ライブラリやプラグインを追加する際に「パッケージが見つからない」という場合があります。
パッケージ名まで書くと scalatyped.converter を sbt plugin として入れたかったのですが、見つからずにエラーになりました。
(scalaJs で使うパッケージです)
ドキュメントを Setup を読むとちゃんと書いてあったのですが、読み飛ばしてエラーになってました
(タイトルに書いてしまってますが)そういう場合にはリゾルバーを設定・追加すると解決する場合があるので、その際の方法を記載します。
事象について
エラー文
まわりくどいですが、ここで「パッケージがみつからない」と言っているのはどういうケースかを先に言及します
具体的には以下のようなメッセージが sbt reload 実行時に出る場合を想像しています。
>sbt reload
[info] Loading global plugins from C:\Users\Ore\.sbt\1.0\plugins
:
[error] (update) sbt.librarymanagement.ResolveException: Error downloading <package-name>:<libarary-name>;sbtVersion=1.0;scalaVersion=2.12:<library-version>
[error] Not found
エラー発生の原因について
このエラーが発生するときについて、原因としては
「sbt が探したパッケージ管理サービスにパッケージがない」ために発生しています。
理由として考えられる(自分が遭遇したことのある)のは、だいたい以下の2パターンだと思っています。
- 指定したバージョン間違い
(maven repository などのデフォルトで探すパッケージ管理サービス内にバージョンがない) - さがすパッケージ管理サービスが不足している
該当のエラーが出る場合、前者の場合がほとんどのような気がします。
この場合は sbt ファイルなどに書いたバージョンを直すと解消されます。
(github の releases とか、maven repository から探してバージョンを修正すると間違いがない気がします)
ただ、今回に自分がはまった場合としてが、
さがしに行くパッケージ管理サービスに該当のライブラリ自体がなく、
reload するさいのリゾルバーを追加しないといけないケースだったようです。
実際の対処方法(記述内容)
実際に今回のエラーの対処方法です。
といっても sbt ファイルにリゾルバーを追記するだけです。
Resolver クラスは他のパッケージ管理サービスの情報を返すメソッドが用意されていそうなので、それを使えます。
使いたかったパッケージは bintrary にあるようだったので、それ用にリゾルバーに追加したい場合、
Resolver.bintrayRepo() を既存のリゾルバー変数 resolvers に追加します。
今回は plugin のためなので、 plugin.sbt に記載します。
resolvers += Resolver.bintrayRepo("oyvindberg", "converter")
addSbtPlugin("org.scalablytyped.converter" % "sbt-converter06" % "1.0.0-beta28")
これで plugin を追加できるようになったので、
あとは build.sbt で plugin を有効化します。
enablePlugins(ScalaJSBundlerPlugin, ScalablyTypedConverterPlugin)
これで使いたかったプラグインを使えるようになりました。
最後に
sbt の resolver を追加する方法が理解できました。
あと、「ドキュメントは偉大だ」というのを改めて確認できます。