2011-07-08 15 views
10

Próbuję skonfigurować SBT, aby skompilować istniejący projekt, który nie korzysta ze struktury katalogu maven. Używam full configuration i ustawiono moje javaSource & ustawienia resourceDirectory następująco:Filtrowanie zasobów w SBT

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

Teraz chcę mieć możliwość filtrowania zasobów zaliczamy w artefaktu słoik, ponieważ obecnie zrobić z ant, plus wykluczyć. pliki java, ponieważ nasze zasoby są mieszane z kodem źródłowym. Na przykład:

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

Czy jest jakikolwiek sposób to zrobić?

+0

Po prostu informacja dla osób, które patrzą na to pytanie, to jest SBT 0.10. –

+0

Warto utworzyć tag sbt10? To tak bardzo różni się od sbt07 ... – opyate

+1

sub subskrypcja - "defaultExcludes" został wycofany na rzecz 'excludeFilter'in sbt 0.11 – wbarksdale

Odpowiedz

6

Użyj zakresu defaultExcludes dla zadania unmanagedResources i opcjonalnie konfiguracji. Na przykład, ustawienie wyklucza .java pliki z głównych źródeł:

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

in Compile ogranicza to ustawienie, aby zastosować tylko do głównych zasobów. Używając zamiast tego opcji in Test, będzie to dotyczyło tylko testowania zasobów. Pomijając konfigurację (to jest nie in Compile lub in Test), ustawienie dotyczyłoby zarówno zasobów głównych, jak i testowych.

in unmanagedResources stosuje te wykluczenia tylko dla zasobów. Aby zastosować wykluczenia do źródeł, na przykład zakres byłby następujący: in unmanagedSources. Powodem części niezarządzanej jest podkreślenie, że odnoszą się one tylko do źródeł niezarządzanych (lub edytowanych ręcznie).

Klucz defaultExcludes ma typ sbt.FileFilter, więc wartość ustawienia musi być tego typu. W powyższym przykładzie "*.java" jest niejawnie przekonwertowane na FileFilter. * jest interpretowany jako symbol wieloznaczny, dlatego filtr akceptuje pliki o nazwie kończącej się na ".java". Aby połączyć filtry, używaj || i &&. Na przykład, jeśli .scala pliki potrzebne aby wykluczyć także argument do := byłoby:

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

W oryginalnym Ant zestawu plików, to włączać i wyłączać filtry wybrać wzajemnie wykluczających zestawów plików, więc jest tylko jeden niezbędny.

Możliwe jest również bezpośrednie zbudowanie Seq[File] dla unmanagedResources. Na przykład:

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

Sposób ** wybiera wszystkie potomków, które pasują do FileFilter argument. Możesz sprawdzić, czy pliki zostały wybrane zgodnie z oczekiwaniami, uruchamiając show unmanaged-resources.

+0

Działa to, jeśli chcę wykluczyć pliki .java, czy jestem w stanie uwzględnić tylko określony zestaw plików? Zgaduję, że zanegowanie 'sbt.FileFilter' zadziała, jeśli to możliwe. –

+0

Nie ma komplementarnego ustawienia 'includes' lub czegokolwiek. Istnieje 'sourceFilter' dla źródeł i' classpathFilter' dla ścieżek klas, ale nic dla zasobów. Byłoby użyteczne zunifikować je w ramach rzeczy takich jak 'include in unmanagedResources', więc możesz [otworzyć błąd] (https://github.com/harrah/xsbt/issues). Negowanie 'FileFilter' jest możliwe, ale nie pomoże tutaj. –

+0

Edytowałem odpowiedź, aby uwzględnić sposób bezpośredniego konfigurowania ustawień zasobów. –