Фильтрация ресурсов в SBT - PullRequest
10 голосов
/ 08 июля 2011

Я пытаюсь настроить SBT для компиляции существующего проекта, который не использует структуру каталогов maven. Я использую полную конфигурацию и настроил мои параметры javaSource & resourceDirectory следующим образом:

def settings = Defaults.defaultSettings ++ Seq(
    resourceDirectory in Compile <<= baseDirectory( _ / "java" ),
    javaSource in Compile <<= baseDirectory( _ / "java" )
)

Теперь я хочу иметь возможность фильтровать ресурсы, которые мы включаем в артефакт jar, как мы сейчас делаем с ant, плюс исключать файлы .java, поскольку наши ресурсы смешаны с исходным кодом. Например:

<fileset dir="java" includes="**/*.txt, **/*.csv" excludes="**/*.java" />

Есть ли способ сделать это?

1 Ответ

6 голосов
/ 18 июля 2011

Используйте defaultExcludes для задачи unmanagedResources и, при необходимости, для конфигурации. Например, этот параметр исключает файлы .java из основных ресурсов:

defaultExcludes in Compile in unmanagedResources := "*.java"

in Compile ограничивает эту настройку только для основных ресурсов. Вместо этого in Test будет применяться только к тестовым ресурсам. Опуская конфигурацию (то есть, не in Compile или in Test), параметр будет применяться как к основным, так и к тестовым ресурсам.

in unmanagedResources применяет эти исключения только для ресурсов. Например, для применения исключений к источникам область действия будет in unmanagedSources. Причина неуправляемой части состоит в том, чтобы подчеркнуть, что они применяются только к неуправляемым (или отредактированным вручную) источникам.

Ключ defaultExcludes имеет тип sbt.FileFilter, поэтому значение параметра должно быть этого типа. В приведенном выше примере "*.java" неявно преобразуется в FileFilter. * интерпретируется как подстановочный знак, поэтому фильтр принимает файлы с именем, оканчивающимся на «.java». Для объединения фильтров вы используете || и &&. Например, если файлы .scala также необходимо исключить, аргумент := будет:

"*.java" || "*.scala"

В исходном наборе файлов Ant фильтры включения и исключения выбирают взаимоисключающие наборы файлов, поэтому необходим только один.

Также можно напрямую построить Seq[File] для unmanagedResources. Например:

unmanagedResources in Compile <<=
  unmanagedResourceDirectories in Compile map { (dirs: Seq[File]) =>
    ( dirs ** ("*.txt" || "*.csv" -- "*.java") ).get
  }

Метод ** выбирает всех потомков, которые соответствуют аргументу FileFilter. Вы можете проверить, что файлы выбраны так, как вы ожидаете, запустив show unmanaged-resources.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...