Aller au contenu

Source sets

Comment Elide trouve les sources et les ressources d'un projet : l'arborescence src conventionnelle, la déclaration de source sets dans elide.pkl, la priorité et le classpath de chaque source set.

Sur cette page

Un source set est un groupe nommé de sources et de ressources. Elide en déduit les tâches de compilation, de test et d’empaquetage.

Arborescence conventionnelle

main se trouve dans src/main, test dans src/test, tout autre source set dans src/<name> :

CheminSignification
src/<set>/java, /kotlin, /js, /ts, /pythonSources, un répertoire par langage
src/<set>/resourcesRessources
  • Chaque répertoire de langage présent est compilé. S’il n’y en a aucun, src/<set> lui-même est la racine des sources.
  • src sert de src/main ; test ou tests servent de src/test.
  • main et test existent dès que leurs répertoires existent. Les autres source sets doivent être déclarés.

Cette arborescence ne nécessite pas de bloc sources :

src/main/kotlin/sample/Main.kt
src/main/resources/app.properties
src/test/kotlin/sample/MainTest.kt

elide project info affiche les source sets résolus ; (by convention) signale les chemins issus de l’arborescence.

Déclarer des source sets

sources {
  // A glob moves only the sources.
  ["main"] = "lib/**/*.kt"

  // A block sets more properties.
  ["integrationTest"] {
    type = "test"
    paths { "it/**/*.kt" }
  }
}

new Sources.SourceSetSpec { … } (avec import "elide:Sources.pkl" as Sources) est la forme longue de l’entrée. Les chemins sont des globs ou des répertoires relatifs au projet ; un répertoire est parcouru récursivement.

Priorité

Chaque propriété déclarée remplace la convention pour cette propriété seulement.

PropriétéOmiseDéclarée
typeDéduit du nomToujours utilisé
pathsL’arborescence conventionnelle pour ce nomUtilisés tels quels
resourcessrc/<name>/resources, s’il existeUtilisées telles quelles
dependsOnLes source sets de test et d’exemple voient mainUtilisé tel quel ; vide signifie aucun
typeDéduit deComportement
testtest, testsExécuté par elide test ; résout testPackages.
exampleexample, examplesSource set de production.
sourcetout autre nomSource set de production.
other—Source set de production.

Les artefacts qui ne nomment aucune source empaquettent tous les source sets de production. Un source set déclaré dont les chemins couvrent src/main ou src/test remplace ce source set conventionnel, si bien qu’aucun fichier n’est compilé deux fois.

Dépendances et classpaths

Les source sets de production résolvent packages, modules, compileOnly, runtimeOnly et processors. Les source sets de test ajoutent testPackages et les source sets dont ils dépendent. Un source set de test avec dependsOn {} se compile et s’exécute sans les classes ni les ressources de main, mais résout toujours packages. Voir Dépendances.

elide classpath                 # main:compile
elide classpath runtime         # main:runtime
elide classpath test:runtime    # [<source-set>:]<usage>

elide classpath résout le classpath et l’affiche sur une ligne, entrées séparées par :. Usages : compile, runtime, processor, modules, toolchain, provided ; toute autre valeur sort avec le code 2. L’installation écrit aussi .dev/dependencies/m2/{compile,runtime,test,processors}.classpath.

Ressources

Sur la JVM, les ressources sont sur le classpath pendant les exécutions et les tests, et sont copiées dans les JAR.

sources {
  ["main"] {
    resources {
      "assets/banner.txt"
      new {
        from = "config/services"
        into = "META-INF"
      }
    }
  }
}

Un chemin simple est copié à la racine de la sortie. from (un répertoire ou un fichier) est copié sous into : config/services/app.Service devient META-INF/services/app.Service. Par défaut, into est la racine.

Artefacts

artifacts {
  ["app"] = new Jvm.Jar {}                 // every non-test source set
  ["lib"] = new Jvm.Jar { sources { "api" } }
}

Les JAR de sources et de Javadoc suivent la même règle. Les resources d’un JAR s’ajoutent à celles de ses source sets. Voir Assemblage JAR.

Langages

L’extension du fichier détermine le langage : .java, .kt, .js/.mjs/.cjs/.jsx, .ts/.mts/.cts/.tsx, .py. Un source set avec Java et Kotlin lance les deux compilateurs ; un source set sans l’un ni l’autre ne lance aucune compilation JVM. Les réglages du compilateur pour un source set vont dans le bloc du langage, sous le nom du source set : jvm.java.sourceSets (voir Compilateur Java). Les scripts Kotlin (.kts) d’un source set comptent comme sources Kotlin, mais ne produisent pas de classes et leurs types ne sont pas vérifiés.

Cette page vous a-t-elle aidé ?