2009-02-27 5 views
3

Résumé:Nant: l'expansion des propriétés dans une chaîne

Comment développer une propriété avec la valeur "téléchargement \ $ {bulidmode} \ projet \ setup.msi" à "télécharger \ Debug \ projet \ setup.msi" si le buildmode de propriété contenait debug pour que je puisse l'utiliser comme fichier = « » partie de < copie>

Détail:

J'ai un peu d'une exigence pour pouvoir développer des propriétés dans une chaîne à Nant .

Par exemple, j'ai une cible qui copie du fichier A à B. A et B les deux viennent d'un simple fichier CSV deux champs que je suis itérer en utilisant

<foreach item="Line" in="filelist.csv" delim="," property="source.file,target.file"> 

    <property name="sourcefile" value="${path::combine(source.dir,source)}" /> 
    <property name="targetfile" value="${path::combine(download.dir,destination)}" /> 
    <echo message="Copy ${sourcefile} to ${targetfile}" /> 

    <copy file="${sourcefile" tofile="${destination}" /> 

</foreach> 

et la filelist.csv sera être

build\manifest.xml 
solutiondirectory\setup-proj-directory\Release\setupproj.msi,ProductA\ProductA.msi 
solutiondirectory\another-proj-dir\Release\setupproj.msi,ProductB\ProductB.msi 

(La raison pour laquelle nous avons divisé ces derniers dehors est que nous écrivons des applications à plusieurs niveaux et le déploiement par MSI à chaque niveau - si un produit a plusieurs tous de msi construit avec les mêmes numéros de version)

Quoi qu'il en soit - Je veux changer cela en ce que je n'ai plus "Release" dans le fichier filelist.csv mais quelque chose comme $ {build.mode}. Je wrapper le code ci-dessus avec un

<foreach item="String" in="Release,Debug" delim="," property="build.mode"> 
....as above 
</foreach> 

et la propriété incorporée dans la chaîne dans le fichier est développée.

Je me suis cogné la tête contre un mur de briques pendant quelques heures, mais je n'arrive tout simplement pas à comprendre.

Merci

Répondre

4

Il est possible avec une fonction personnalisée:

<?xml version="1.0"?> 
<project> 
    <script language="C#" prefix="vbfox" > 
     <code> 
      <![CDATA[ 
      [Function("expand")] 
      public string ExpandString(string str) 
      { 
       return Project.Properties.ExpandProperties(str, Location.UnknownLocation); 
      } 
      ]]> 
     </code> 
    </script> 
    <property name="hello" value="{path::combine('_hello_', '_world_')}" /> 
    <property name="hello" value="${'$' + hello}" /> 
    <echo message="${hello}" /> 
    <echo message="${vbfox::expand(hello)}" /> 
</project> 
+0

Un grand merci - fonctionne très bien - mais l'inconvénient est qu'il est ouvert un tout nouveau domaine de Nant dont je n'étais pas vraiment conscient. Toujours quelque chose de nouveau à apprendre! Alan. –

+0

Oui, être capable d'utiliser des tâches/fonctions C# personnalisées dans NAnt est génial et pouvoir le faire en ligne sans créer un nouvel assemblage est encore mieux. –