2010-06-17 3 views
2

Dans mon script NAnt, j'ai une cible de compilation qui appelle csc. À l'heure actuelle échoue car aucune entrée sont spécifiées:Comment puis-je dire à nant d'appeler seulement csc quand il y a des fichiers cs à compiler?

<target name="compile"> 
    <csc 
     target="library" 
     output="${umbraco.bin.dir}\Mammoth.${project::get-name()}.dll"> 
     <sources> 
     <include name="project/*.cs" /> 
     </sources> 
     <references> 
     </references> 
    </csc>  
    </target> 

Comment puis-je dire NAnt de ne pas exécuter la tâche de se csc il n'y a pas de fichiers CS? J'ai lu à propos de l'attribut 'if' mais je ne sais pas quelle expression utiliser avec lui, car $ {file :: exists ('*. Cs')} ne fonctionne pas. Le script de construction est un modèle pour les projets Umbraco (un CMS) et peut ou non avoir des fichiers source .cs dans le projet. Idéalement, je voudrais que les développeurs n'aient pas besoin de se souvenir de modifier le script NAnt pour inclure la tâche de compilation lorsque les fichiers .cs sont ajoutés au projet (ou l'exclure lorsque tous les fichiers .cs sont supprimés).

Répondre

2

Il s'agit d'environ NAnt filesets. <sources> est de type groupe de fichiers. La manipulation de ces ensembles de fichiers est souvent difficile dans NAnt. Comme il n'y a pas de fonction fileset::is-empty nous devons vérifier explicitement:

<fileset id="sourcefiles"> 
    <include name="project/*.cs" /> 
</fileset> 
<property 
    name="sourcefiles.count" 
    value="0" /> 
<foreach item="File" property="filename"> 
    <in> 
    <items refid="sourcefiles" /> 
    </in> 
    <do> 
    <property 
     name="sourcefiles.count" 
     value="${int::parse(sourcefiles.count) + 1}" /> 
    </do> 
</foreach> 
<if test="${int::parse(sourcefiles.count) > 0}"> 
    <csc 
    target="library" 
    output="${umbraco.bin.dir}\Mammoth.${project::get-name()}.dll"> 
    <sources refid="sourcefiles" /> 
    <references> 
    </references> 
    </csc> 
</if> 

Je suis d'accord que cela est un peu lourd, mais je ne suis pas au courant d'une solution de rechange. Eh bien, vous pouvez utiliser l'attribut failonempty sur le groupe de fichiers, mais vous devrez alors gérer l'exception.

Mise à jour: Hier, j'ai trouvé une alternative: Si cela ne vous dérange pas l'utilisation NAntContrib il y a une fonction fileset::has-files. C'est le code:

<fileset id="sourcefiles"> 
    <include name="project/*.cs" /> 
</fileset> 
<if test="${fileset::has-files('sourcefiles')}"> 
    <csc 
    target="library" 
    output="${umbraco.bin.dir}\Mammoth.${project::get-name()}.dll"> 
    <sources refid="sourcefiles" /> 
    <references> 
    </references> 
    </csc> 
</if> 
+0

wow. Merci. Il y a beaucoup dans votre réponse que je ne savais pas que NAnt pouvait faire :) –

+0

Cela a fonctionné pour moi :) Merci pour la bonne réponse. J'essayais seulement de déplacer et de compresser des captures d'écran de jpg après qu'une suite de tests ait fonctionné s'il y avait des erreurs qui ont fait des images de jpg dans le dossier. – PHPGuru

Questions connexes