2011-09-13 1 views
5

Je veux définir une tâche, qui appelle des tâches compile et paquetBin, puis fait son travail. Comment je fais ça? Actuellement, cela ne fait que la deuxième partie et ignore les tâches & paquetBin.Comment dépendre d'autres tâches et faire votre code dans SBT 0.10?

lazy val dist = TaskKey[Unit](
    "dist", "Creates a project distribution in dist/ folder." 
) 
def distTask = { 
    dist <<= dist.dependsOn(compile, packageBin) 
    dist <<= (update, crossTarget).map { case (updateReport, out) => 
    updateReport.allFiles.foreach { srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified=true) 
    } 
    } 
} 
+0

Dans la mesure où une solution de contournement j'ai pu utiliser ~; compile; package; dist tâche – arturaz

Répondre

3

<<= est une méthode sur TaskKey qui renvoie une valeur. Il ne met pas à jour l'état mutable n'importe où, donc dans le code d'exemple, le résultat du premier appel est rejeté. Pour résoudre ce problème, déclarez aussi packageBin comme une entrée, mais ignorez la valeur résultante. Notez que packageBin dépend de la compilation, donc en fonction de la compilation est inutile.

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) => 

Il est peu probable que vous souhaitez copier tous les fichiers dans un UpdateReport dans un répertoire basé uniquement sur le nom du fichier. Il est possible que différentes dépendances aient le même nom de fichier. En outre, cela inclura les dépendances de toutes les configurations, y compris les dépendances de test.

Pour le premier problème, utilisez le ModuleID associé pour construire le chemin dans le répertoire cible, comme dans le répertoire lib_managed lorsque retrieveManaged := true. Pour le second problème, sélectionnez uniquement les fichiers pour la configuration souhaitée.

updateReport.matching(configurationFilter(Runtime.name)).foreach... 

Voir les pour d'autres méthodes utiles docs API sbt.UpdateReport et sbt.RichUpdateReport.

Si vous n'êtes pas concerné par les collisions de noms de fichiers, vous pouvez obtenir les fichiers de dépendance à partir de dependencyClasspath. Par exemple:

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) => 

et obtenir le Seq[File] de cp.files.

+0

Merci pour la bonne réponse. Cependant quand j'essaye d'ajouter paquetBin comme dépendance, je reçois ceci: [erreur] sbt.Init $ Non initialisé: référence au paramètre non initialisé {file:/home/arturas/travail/spacegame/server/vendor/SpaceMule /} SpaceMule/*: package de {file:/home/arturas/travail/espacegame/serveur/fournisseur/SpaceMule /} SpaceMule/*: dist [erreur] Utilisez 'last' pour le journal complet. – arturaz

+0

Avez-vous inclus la partie 'dans la compilation'? –

+1

Oh, je l'ai manqué. Cela fonctionne maintenant, merci :) – arturaz

Questions connexes