• Stars
    star
    255
  • Rank 159,729 (Top 4 %)
  • Language
    Scala
  • License
    Apache License 2.0
  • Created about 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

sbt-explicit-dependencies

CI

An sbt plugin to check that your libraryDependencies accurately reflects the libraries that your code depends on in order to compile.

For example, say your project declares only a single dependency:

libraryDependencies += "org.typelevel" %% "cats-effect" % "1.0.0"

This brings in a few other libraries as transitive dependencies, including cats-core.

If your code directly depends on classes from cats-core, e.g.:

val nel = cats.data.NonEmptyList.of(1, 2, 3)

then this plugin will warn you about that fact.

The plugin can also warn you if you have anything in your libraryDependencies that you're not actually using.

Why?

If you want to avoid dependency hell, it's good practice to explicitly declare all libraries that your code directly depends on for compilation.

If you want to keep your deployment artifacts small, you don't want to declare dependencies on any libraries you don't actually need.

How to install

Maven Central

Add the plugin in project/plugins.sbt or as a global plugin in ~/.sbt/1.0/plugins/plugins.sbt:

addSbtPlugin("com.github.cb372" % "sbt-explicit-dependencies" % "latest version (see badge above)")

How to use

Finding accidental use of transitive dependencies

The undeclaredCompileDependencies task shows a list of dependencies that should be declared explicitly:

sbt:example> undeclaredCompileDependencies
[warn] example >>> The project depends on the following libraries for compilation but they are not declared in libraryDependencies:
[warn]  - "com.chuusai" %% "shapeless" % "2.3.3"
[warn]  - "com.google.guava" % "guava" % "26.0-jre"
[warn]  - "org.typelevel" %% "cats-core" % "1.2.0"
[warn]  - "org.typelevel" %% "cats-effect" % "0.10.1"
[success] Total time: 0 s, completed 01-Oct-2018 00:16:31

There is also a task undeclaredCompileDependenciesTest which will fail the build if there are any undeclared dependencies. This can be useful as part of a CI pipeline:

sbt:example> undeclaredCompileDependenciesTest
[warn] example >>> The project depends on the following libraries for compilation but they are not declared in libraryDependencies:
[warn]  - "com.chuusai" %% "shapeless" % "2.3.3"
[warn]  - "com.google.guava" % "guava" % "26.0-jre"
[warn]  - "org.typelevel" %% "cats-core" % "1.2.0"
[warn]  - "org.typelevel" %% "cats-effect" % "0.10.1"
[error] (undeclaredCompileDependenciesTest) Failing the build because undeclared dependencies were found
[error] Total time: 1 s, completed 01-Oct-2018 00:17:05

Finding unnecessary dependencies

The unusedCompileDependencies task shows a list of libraries that have been declared as dependencies but are not actually needed for compilation:

sbt:example> unusedCompileDependencies
[warn] example >>> The following libraries are declared in libraryDependencies but are not needed for compilation:
[warn]  - "com.github.cb372" %% "scalacache-guava" % "0.24.3"
[warn]  - "org.http4s" %% "http4s-circe" % "0.18.16"
[warn]  - "org.postgresql" % "postgresql" % "42.2.5"
[warn]  - "org.tpolecat" %% "doobie-postgres" % "0.5.3"
[success] Total time: 0 s, completed 01-Oct-2018 00:17:34

This is also a task unusedCompileDependenciesTest which will fail the build if this list is non-empty. This can be useful as part of a CI pipeline:

sbt:example> unusedCompileDependenciesTest
[warn] example >>> The following libraries are declared in libraryDependencies but are not needed for compilation:
[warn]  - "com.github.cb372" %% "scalacache-guava" % "0.24.3"
[warn]  - "org.http4s" %% "http4s-circe" % "0.18.16"
[warn]  - "org.postgresql" % "postgresql" % "42.2.5"
[warn]  - "org.tpolecat" %% "doobie-postgres" % "0.5.3"
[error] (unusedCompileDependenciesTest) Failing the build because unused dependencies were found
[error] Total time: 0 s, completed 01-Oct-2018 00:18:00

Runtime Dependencies

Some libraries need to be added to the runtime classpath, but aren't required for compilation. (Logging libraries that implement the SLF4J framework are a common example.) These libraries should be added using the Runtime configuration so they're added to Runtime / dependencyClasspath and not Compile / dependencyClasspath, and will be automatically excluded from consideration by this plugin. For example:

libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3" % Runtime

Filtering the results

If the result of either undeclaredCompileDependencies or unusedCompileDependencies contains any dependencies you don't care about, you can exclude them using the undeclaredCompileDependenciesFilter and unusedCompileDependenciesFilter settings.

For example:

unusedCompileDependenciesFilter -= moduleFilter("org.scalaz", "scalaz")

Note: If you're filtering things out because you think the plugin is returning false-positive results, please open a GitHub issue.

Debugging

You can pass -debug flag to sbt or set logLevel to debug to understand how the plugin computes compile depndencies

sbt:example> set logLevel := Level.Debug
sbt:example> unusedCompileDependencies
...
[debug] Source to library relations:
[debug]   sbt-explicit-dependencies/example/src/main/scala/foo/MyCaseClass.scala -> /Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-effect_2.12/0.10.1/cats-effect_2.12-0.10.1.jar
[debug]   sbt-explicit-dependencies/example/src/main/scala/foo/Example.scala -> /Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/1.2.0/cats-core_2.12-1.2.0.jar
...
[debug] Library dependencies:
[debug]   /Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-effect_2.12/0.10.1/cats-effect_2.12-0.10.1.jar
[debug]   /Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/typelevel/cats-core_2.12/1.2.0/cats-core_2.12-1.2.0.jar
...
[debug] jarFile: cats-effect_2.12-0.10.1.jar -> "org.typelevel" %% "cats-effect" % "0.10.1"
[debug] jarFile: cats-core_2.12-1.2.0.jar -> "org.typelevel" %% "cats-core" % "1.2.0"
...
[debug] Compile depends on:
[debug]   "org.typelevel" %% "cats-effect" % "0.10.1"
[debug]   "org.typelevel" %% "cats-core" % "1.2.0"
...
[debug] Declared dependencies:
[debug]   "org.http4s" %% "http4s-blaze-server" % "0.18.16"
[debug]   "org.http4s" %% "http4s-circe" % "0.18.16"
...

Example project

There is an example sbt project in the example folder so you can see the plugin in action.

More Repositories

1

scalacache

Simple caching in Scala
Scala
772
star
2

cats-retry

Scala
278
star
3

scala-typed-holes

Scala
185
star
4

line-count

A line counter for GitHub-hosted repositories, built with node.js
JavaScript
144
star
5

sbt-client

A thin client for sbt
Rust
93
star
6

free-vs-tagless-final

Scala
80
star
7

metrics-sigar

Metrics + Hyperic Sigar for OS-level monitoring
Java
77
star
8

automagic

Boilerplate-free model transformation in Scala
Scala
33
star
9

ReengLegacySoft

Code for the book Re-Engineering Legacy Software
Java
33
star
10

gke-vpc-peering-tutorial

HTML
32
star
11

web-app-functional-style

Scala
32
star
12

scalac-plugin-basic

Scala
28
star
13

cats-selective

Scala
27
star
14

reinforcement-learning-in-scala

Source code for Reinforcement Learning in Scala talk
Scala
26
star
15

scala-ascii-art

A simple Ascii art generator. A toy project to help me learn Scala. Pretty much a port to Scala of this: http://www.bestinclass.dk/index.php/2010/02/my-tribute-to-steve-ballmer/
Scala
23
star
16

scala-thank-you

Scala
18
star
17

type-class-derivation-in-scala-3

Scala
17
star
18

intellij-idris

Scala
15
star
19

sbt-classy

Scala
14
star
20

externalized

A handy DSL that makes it easier to work with external processes in Java
Java
13
star
21

cli-tools-skills-amnesty

Lesson notes for CLI tools training
Vim Script
12
star
22

scala-native-example-webserver

Scala
11
star
23

pakkas

An implementation of Basic Paxos, including leader election, in Akka.
Scala
11
star
24

jersey-jetty-guice-archetype

A Maven archetype for creating a standalone REST API-serving application
Java
11
star
25

scoogle

Hoogle for Scala (just a proof of concept, mostly smoke and mirrors)
Scala
10
star
26

observed-logstash

A plugin for Observed that runs an Elasticsearch query and checks the number of matching logs as a sign of healthiness
Ruby
10
star
27

scalamatsuri-my-first-macro

マクロ入門サンプル
Scala
9
star
28

docker-sample

Example Docker container for a Java webapp dependent on Tomcat + Nginx + Maven + Git
Shell
9
star
29

scala-school

Intermediate level (whatever that means) Scala training at the Guardian
Scala
8
star
30

fedis

A mock Redis server built with Finagle
Scala
7
star
31

two-to-tango

A simple app to help people find pair-programming buddies
Scala
7
star
32

play-forms-tutorial

Scala
6
star
33

dotfiles

Vim Script
6
star
34

jmh-plot

CLI tool to render JMH benchmark results using gnuplot
Scala
6
star
35

dispatch-example

Dispatchライブラリの使い方のちょっとしたサンプル
Scala
6
star
36

imperials

A data repository and dashboard for Yammer Metrics.
Scala
6
star
37

idris-for-scala-devs

Idris
5
star
38

phone-home

A Javascript client and Scalatra server for collecting client-side errors and diagnostics
JavaScript
5
star
39

elasticsearch-rspec-example

A simple Rails app showing how to use Rspec with Elasticsearch/Tire
Ruby
5
star
40

analysing-git-commit-graphs-with-droste

Scala
4
star
41

forks

A better UI for listing the forks of a Github project
Scala
4
star
42

obscure-cricket-stats

Bot that tweets randomly chosen cricket stats
HTML
4
star
43

staged-programming-in-scala-3

Scala
4
star
44

prisms

Scala
3
star
45

enumerate

Scala
3
star
46

aws-incremental-search

A Chrome extension to make the AWS console home screen easier to use
JavaScript
3
star
47

sbt-write-output-to-file

sbt plugin that writes the stdout of sbt run to a file
Scala
3
star
48

coc-github-users

TypeScript
3
star
49

cats-tagless-example

Scala
3
star
50

vector-foldRight-benchmark

Scala
3
star
51

massaging-case-classes-with-shapeless

Scala
2
star
52

useless-crap

Track your unnecessary spending
Scala
2
star
53

scala-beyond-the-basics

Scala
2
star
54

morocco

Rust
2
star
55

abstractiterator

Scala
2
star
56

meta-prog-shapeless-talk

Scala
2
star
57

rl-in-scala

HTML
2
star
58

Java7Sandbox

Messing around with the new features in JDK 7
Java
2
star
59

mfa-example

Haskell
2
star
60

sudoxir

A parallel brute-force Sudoku solver written in Elixir
Elixir
2
star
61

tweet-punchcard

Simple Heroku app to display Twitter activity as a punchcard
Python
2
star
62

Asakai

A sample Play application I made for a company presentation
Scala
2
star
63

coursera

Coursera programming answers
Scala
2
star
64

s3-encrypt

Scala
2
star
65

json-web-tokens

Scala
2
star
66

aws-prod-chrome-extension

JavaScript
2
star
67

finagle-beanstalk

A Scala client for beanstalkd, based on Finagle RPC framework.
Scala
2
star
68

copy_info_from_parent_issue

A Redmine plugin that makes it easier to create child tickets
Ruby
2
star
69

my-php-app

Shell
1
star
70

memoize-dotty

Scala
1
star
71

persevere

A library for asynchronous retries
Java
1
star
72

WinnersLosers

A simple Python script to parse historical shares info from a file and create a portfolio of winners and losers.
Python
1
star
73

wreq4s

Scala
1
star
74

theres-wally

Jupyter Notebook
1
star
75

spotifyify

A command-line tool for importing your local music collection into Spotify
Haskell
1
star
76

ordasity-example

A simple example of Boundary's Ordasity library. An Ordasity cluster for searching Twitter.
Scala
1
star
77

programming-trick-shots

Assembly
1
star
78

mu-tracing-example

Scala
1
star
79

van-emde-boas

Scala
1
star
80

play-configurable-ningwsplugin

Scala
1
star
81

kafka-notifications

A proof-of-concept for using Kafka for real-time notifications
Scala
1
star
82

50apps

My entries for the 50 Apps in 50 Weeks Challenge
Python
1
star
83

PageWatcher

A simple Play app to watch for changes in a given set of webpages
Scala
1
star
84

unbounded-spigot-fs2

Scala/fs2 implementation of Unbounded Spigot Algorithms for the Digits of Pi
Scala
1
star
85

dining-philosophers-pony

An implementation of the Dining Philosophers problem in Pony
Pony
1
star
86

ScalaSnippets

Random code snippets and utilities
Scala
1
star
87

raft

An implementation of the Raft consensus algorithm in Scala
Scala
1
star
88

cb372.github.com

Scala
1
star
89

mu-haskell-sandbox

Haskell
1
star
90

KagemaiCommenter

An SVN post-commit script for posting comments to Kagemai
Ruby
1
star
91

scalafix-example

Scala
1
star
92

elasticsearch-test-example

A simple example showing how to use tlrx/elasticsearch-test
Java
1
star
93

rpscala

rpscala
Scala
1
star