53 votes

-Ywarn-inutilisé-importation de déclenchement sur jouer un fichier de routes

Je veux être en mesure d'utiliser -Xfatal-warnings et -Ywarn-unused-import, le problème est que le compilateur est le déclenchement d'une erreur sur le fichier qui contient le parcours de jeux pour mon application:

[error] /path/to/app/conf/routes: Unused import
[error] /path/to/app/conf/routes: Unused import
[error] /path/to/app/conf/routes:1: Unused import
[error] GET        /document/:id        my.app.controllers.MyController.getById(id: Int)

en va de même pour les autres parcours.

Est-il possible peut-être de dire scalac d'ignorer un fichier?

Scala version est - 2.11.8.

5voto

Matt Stephens Points 21

Je viens de rencontré le même problème avec Scala 2.12 et Jouer 2.6 (que vous êtes probablement en train de l'utiliser).

Un compilateur Scala plugin appelé Silencieux sortes: https://github.com/ghik/silencer

Ajouter la dépendance suivant en construire.sbt:

val silencerVersion = "1.2.1"

libraryDependencies ++= Seq(
    compilerPlugin("com.github.ghik" %% "silencer-plugin" % silencerVersion),
    "com.github.ghik" %% "silencer-lib" % silencerVersion % Provided
)

Puis ajouter (également dans la construction.sbt):

scalacOptions += "-P:silencer:globalFilters=[conf/routes]"

Le texte entre crochets est une liste de correspondances regex pour les avertissements du compilateur de silence, peuvent être séparées par des virgules. Vous pourriez avoir besoin de modifier la regex pour votre propre cas, mais j'ai trouvé l'exemple ci-dessus a bien fonctionné.

4voto

danielnixon Points 3070

Un horrible "solution" pourrait être de supprimer ceux qui sont inutilisés importations, après les routes sont générés, mais avant de le compiler l'exécution de la tâche. Voici un croquis:

lazy val optimizeRoutesImports = taskKey[Unit]("Remove unused imports from generated routes sources.")

optimizeRoutesImports := {

  def removeUnusedImports(targetFiles: (File) => PathFinder, linesToRemove: Set[String], linesToReplace: Map[String, String]) = {
    val files = targetFiles(crossTarget.value).get
    files foreach { file =>
      val lines = sbt.IO.readLines(file)
      val updatedLines = lines map { line =>
        linesToReplace.getOrElse(line, line)
      } filterNot { line =>
        linesToRemove.contains(line.trim)
      }
      sbt.IO.writeLines(file, updatedLines, append = false)
    }
  }

  removeUnusedImports(
    _ / "routes" / "main" / "controllers" / "ReverseRoutes.scala",
    Set("import ReverseRouteContext.empty"),
    Map(
      "import play.api.mvc.{ QueryStringBindable, PathBindable, Call, JavascriptLiteral }" ->
        "import play.api.mvc.{ QueryStringBindable, PathBindable, Call }",
      "import play.core.routing.{ HandlerDef, ReverseRouteContext, queryString, dynamicString }" ->
        "import play.core.routing.{ ReverseRouteContext, queryString, dynamicString }"
    )
  )

  removeUnusedImports(
    _ / "routes" / "main" / "controllers" / "javascript" / "JavaScriptReverseRoutes.scala",
    Set(
      "import play.core.routing.{ HandlerDef, ReverseRouteContext, queryString, dynamicString }",
      "import ReverseRouteContext.empty"
    ),
    Map(
      "import play.api.mvc.{ QueryStringBindable, PathBindable, Call, JavascriptLiteral }" ->
        "import play.api.mvc.{ QueryStringBindable, PathBindable }"
    )
  )

  removeUnusedImports(
    _ / "routes" / "main" / "router" / "Routes.scala",
    Set("import play.core.j._"),
    Map())
}

Vous devrez alors vous voulez trier les dépendances de tâches:

// Our optimize routes imports task depends on the routes task.
optimizeRoutesImports := (optimizeRoutesImports dependsOn (play.sbt.routes.RoutesKeys.routes in Compile)).value

// And compilation depends on the unused routes having been removed.
compile := ((compile in Compile) dependsOn optimizeRoutesImports).value

Vous aurez probablement aussi besoin de fixer TwirlKeys.templateImports à un conservateur de la liste avant de l'activer, -Ywarn-unused-import. Quelque chose comme cela, qu'en fonction des types utilisés dans votre point de vue:

TwirlKeys.templateImports := Seq("play.api.mvc._", "play.api.i18n.Messages", "controllers.routes")

J'ai également eu à frapper inutilisés TemplateMagic des importations de Virevolter modèles (YMMV):

  removeUnusedImports(
    _ / "twirl" ** "*.template.scala",
    Set("import play.twirl.api.TemplateMagic._"),
    Map())

Si vous le faites, assurez-vous que les dépendances de tâches sont définies de façon appropriée.

Cela fonctionne pour moi. Scala 2.11.8, Jouer 2.5.10, les deux -Xfatal-warnings et -Ywarn-unused-import activé. Il est hideux, mais il fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X