おおくまねこ

職業プログラマーです。興味のある話題を書いています。

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 を追加する方法が理解できました。

あと、「ドキュメントは偉大だ」というのを改めて確認できます。