2010-10-04 31 views
0

Je rencontre un problème avec la tâche <exec> sur les fichiers batch de mes fichiers de projet NAnt. Sous Windows XP SP 3 (mais pas Windows Vista ou Windows Server 2008) et utilisant NAnt 0.85 ou 0.91alpha2, la tâche <exec> réussira toujours (retournant un code d'erreur de 0) quel que soit le résultat du script exécuté.NAnt <exec> La tâche retourne toujours 0 pour les fichiers batch sous Windows XP

À titre d'exemple, j'ai écrit la cible NAnt suivante:

<target name="build"> 
    <exec program="fail.bat" 
    failonerror="false" resultproperty="makeall.result"> 
</exec> 
<echo message="Makeall task returned result ${makeall.result}"/> 
<fail if="${int::parse(makeall.result) != 0}">Encountered ${makeall.result} errors.</fail> 
</target> 

qui appelle le fichier batch suivant:

exit /b 1 

En fonctionnement normal (Windows Vista), le résultat de l'exécution NAnt est :

build: 

    [exec] C:\Users\Will\Code>exit /b 1 
    [exec] C:\Users\Will\Code\fail.build(6,4): 
    [exec] External Program Failed: C:\Users\Will\Code\fail.bat (return code was 1) 
    [echo] Makeall task returned result 1 

BUILD FAILED - 1 non-fatal error(s), 0 warning(s) 

Mais sur deux machines Windows XP SP3 différentes, le résultat de l'exécution de NAnt est :

build: 

    [exec] C:\Documents and Settings\Will\My Documents\My Code>exit /b 1 
    [echo] Makeall task returned result 0 

BUILD SUCCEEDED 

Bien que je ne suis pas actualisant la possibilité que ce soit un bug, je trouve qu'il est beaucoup plus probable que j'oublie une configuration cruciale sur la mise sous Windows ou NAnt qui est à l'origine de ce comportement. Est-ce que quelqu'un d'autre a rencontré cela? Y a-t-il une solution de contournement raisonnablement élégante?

Répondre

0

Nant contient 2 fonctions qui pourraient vous être utiles:

Avec ces derniers vous pourriez être en mesure d'écrire une cible pour générer une propriété result de construction prévu. Ensuite, il devrait être possible de comparer le résultat attendu au résultat réel renvoyé. De cette façon, vous pouvez gérer les scénarios spécifiques au système d'exploitation. En ce qui concerne la «cause première» de la différence entre les deux résultats, je ne sais pas pourquoi ils seraient différents entre les versions de Windows.

0

Ceci est le format que nous utilisons, il semble toujours fonctionner pour nous. le dexbuild fichier .bat contient

---------2.0 ------------- "C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv" C:\YourProject\YourSoultion.sln /Rebuild release 

----------3.5-------------- "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv" C:\YourProject\YourSoultion.sln /Rebuild release 

similar logic for 4.0 

ccnet.config 
     <tasks> 
       <nant> 
       <executable>C:\Nant\Nant0.86\bin\nant.exe</executable> 
       <baseDirectory>.</baseDirectory> 
       <buildFile>C:\NANT_SCRIPTS\build.xml</buildFile> 
       <targetList> 
        <target>DexWeb</target> 
       </targetList> 
       <buildTimeoutSeconds>2000</buildTimeoutSeconds> 
       </nant>   
    </tasks> 

    build.xml file 
     <target name="DexWeb"> 
      <exec program="C:\NANT_SCRIPTS\continous\dexbuild.bat" /> 
      </target> 
0

j'ai pu obtenir ce travail à l'aide de commentaires sur this blog post, voir les commentaires de Scott.

au début du fichier batch je mis SETLOCAL enabledelayedexpansion

puis en utilisant suivant SQLCMD

FOR /R %SCRIPTDIR% %%G IN (*.sql) DO (
    sqlcmd -S%SERVER% -d %DB% -E -h-1 -w255 -i "%%G" -b -m 1 -r 
    echo %%G 
    IF !ERRORLEVEL! NEQ 0 GOTO ERROR 
) 

et enfin les étiquettes dans le fichier batch

:ERROR 
SET ERRORLEVEL=!ERRORLEVEL! 
GOTO ERRORExit 

:ResultCode 
EXIT /B %1 

:ERRORExit 
ENDLOCAL & CALL :ResultCode %ERRORLEVEL% 

S'il vous plaît noter la valeur de retour est toujours pas repassé Nant mais la construction échoue OK. J'ai essayé différentes combinaisons de resultproperty et failonerror sans succès.

Fonctionne sous WinXPsp3 avec NANT0.90.

SC