2009-08-18 12 views
2

J'ai converti mon application de .NET 1.1 en .NET 3.5 et malheureusement la balise de NAnt ne supporte pas .NET 3.5. J'essaie donc d'utiliser la balise pour lancer msbuild directement.En passant de <solution> à <exec programme = msbuild> en NAnt

Voici ce que j'ai pour .NET 1.1:

<solution solutionfile="MyApp.sln" 
     configuration="ServerDebug" outputdir="MyApp\bin\ServerDebug"> 

      <assemblyfolders> 
        <include name="Dependencies\Libs\bin\ServerDebug"/> 
      </assemblyfolders> 
</solution> 

Je me suis converti à

<exec program="msbuild"> 
    <arg value="MyApp.sln /p:Configuration=ServerDebug;OutDir=bin\ServerDebug\" /> 
</exec> 

Alors que tout fonctionne bien, sauf que je ne peux pas comprendre comment reproduire le tag vraiment convaincant, ce qui donne au compilateur un indice quant à l'endroit où chercher des dépendances.

Que dois-je passer à msbuild pour répliquer la fonctionnalité?

Répondre

5

Je pense que cela peut être fait avec l'une des deux options. Soit en utilisant AdditionalLibPaths ou AssemblySearchPaths, qui sont décrits on MSDN.

Quelque chose comme ce qui suit:

<exec program="msbuild.exe"> 
    <arg line="/p:Configuration=ServerDebug"/> 
    <arg line="/p:OutDir=bin\ServerDebug\" /> 
    <arg line="/p:AssemblySearchPaths=Dependencies\Libs\bin\ServerDebug" /> 
    <arg line="MyApp.sln" /> 
</exec> 
3

Pour ce que ça vaut, j'ai pu obtenir NAnt 0,86 travailler avec .NET 3.5 en ajoutant ce qui suit à NAnt.exe.config. Après cela, ce bit dans mon fichier de construction à l'intérieur de la balise project était tout ce dont j'avais besoin.

<property name="nant.settings.currentframework" value="net-3.5" /> 

Ajouté à NAnt.exe.config:

<framework 
    name="net-3.5" 
    family="net" 
    version="2.0" 
    description="Microsoft .NET Framework 3.5" 
    sdkdirectory="${path::combine(sdkInstallRoot, 'bin')}" 
    frameworkdirectory="${path::combine(installRoot, 'v3.5')}" 
    frameworkassemblydirectory="${path::combine(installRoot, 'v2.0.50727')}" 
    clrversion="2.0.50727" 
    > 
    <runtime> 
     <probing-paths> 
      <directory name="lib/net/2.0" /> 
      <directory name="lib/net/neutral" /> 
      <directory name="lib/common/2.0" /> 
      <directory name="lib/common/neutral" /> 
     </probing-paths> 
     <modes> 
      <strict> 
       <environment> 
        <variable name="COMPLUS_VERSION" value="v2.0.50727" /> 
       </environment> 
      </strict> 
     </modes> 
    </runtime> 
    <reference-assemblies basedir="${path::combine(installRoot, 'v2.0.50727')}"> 
     <include name="Accessibility.dll" /> 
     <include name="mscorlib.dll" /> 
     <include name="Microsoft.Build.Utilities.dll" /> 
     <include name="Microsoft.Vsa.dll" /> 
     <include name="Microsoft.VisualBasic.dll" /> 
     <include name="Microsoft.VisualBasic.Compatibility.dll" /> 
     <include name="Microsoft.VisualBasic.Compatibility.Data.dll" /> 
     <include name="System.Configuration.dll" /> 
     <include name="System.Configuration.Install.dll" /> 
     <include name="System.Data.dll" /> 
     <include name="System.Data.OracleClient.dll" /> 
     <include name="System.Data.SqlXml.dll" /> 
     <include name="System.Deployment.dll" /> 
     <include name="System.Design.dll" /> 
     <include name="System.DirectoryServices.dll" /> 
     <include name="System.dll" /> 
     <include name="System.Drawing.Design.dll" /> 
     <include name="System.Drawing.dll" /> 
     <include name="System.EnterpriseServices.dll" /> 
     <include name="System.Management.dll" /> 
     <include name="System.Messaging.dll" /> 
     <include name="System.Runtime.Remoting.dll" /> 
     <include name="System.Runtime.Serialization.Formatters.Soap.dll" /> 
     <include name="System.Security.dll" /> 
     <include name="System.ServiceProcess.dll" /> 
     <include name="System.Transactions.dll" /> 
     <include name="System.Web.dll" /> 
     <include name="System.Web.Mobile.dll" /> 
     <include name="System.Web.RegularExpressions.dll" /> 
     <include name="System.Web.Services.dll" /> 
     <include name="System.Windows.Forms.dll" /> 
     <include name="System.Xml.dll" /> 
    </reference-assemblies> 
    <reference-assemblies basedir="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/v3.5"> 
     <include name="Microsoft.Build.Engine.dll" /> 
     <include name="Microsoft.Build.Framework.dll" /> 
     <include name="System.AddIn.Contract.dll" /> 
     <include name="System.AddIn.dll" /> 
     <include name="System.Core.dll" /> 
     <include name="System.Data.DataSetExtensions.dll" /> 
     <include name="System.Data.Linq.dll" /> 
     <include name="System.DirectoryServices.AccountManagement.dll" /> 
     <include name="System.Management.Instrumentation.dll" /> 
     <include name="System.Net.dll" /> 
     <include name="System.ServiceModel.Web.dll" /> 
     <include name="System.Web.Extensions.Design.dll" /> 
     <include name="System.Web.Extensions.dll" /> 
     <include name="System.Windows.Presentation.dll" /> 
     <include name="System.WorkflowServices.dll" /> 
     <include name="System.Xml.Linq.dll" /> 
    </reference-assemblies> 
    <reference-assemblies basedir="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/v3.0"> 
     <include name="System.IdentityModel.dll" /> 
     <include name="System.IdentityModel.Selectors.dll" /> 
     <include name="System.IO.Log.dll" /> 
     <include name="System.Printing.dll" /> 
     <include name="System.Runtime.Serialization.dll" /> 
     <include name="System.ServiceModel.dll" /> 
     <include name="System.Speech.dll" /> 
     <include name="System.Workflow.Activities.dll" /> 
     <include name="System.Workflow.ComponentModel.dll" /> 
     <include name="System.Workflow.Runtime.dll" /> 
     <include name="WindowsBase.dll" /> 
    </reference-assemblies> 
    <task-assemblies> 
     <!-- include MS.NET version-neutral assemblies --> 
     <include name="extensions/net/neutral/**/*.dll" /> 
     <!-- include MS.NET 2.0 specific assemblies --> 
     <include name="extensions/net/2.0/**/*.dll" /> 
     <!-- include MS.NET specific task assembly --> 
     <include name="NAnt.MSNetTasks.dll" /> 
     <!-- include MS.NET specific test assembly --> 
     <include name="NAnt.MSNet.Tests.dll" /> 
     <!-- include .NET 2.0 specific assemblies --> 
     <include name="extensions/common/2.0/**/*.dll" /> 
    </task-assemblies> 
    <tool-paths> 
     <directory name="${path::combine(sdkInstallRoot, 'bin')}" /> 
     <directory name="${path::combine(installRoot, 'v3.5')}" /> 
     <directory name="${path::combine(installRoot, 'v2.0.50727')}" /> 
    </tool-paths> 
    <project> 
     <readregistry 
      property="installRoot" 
      key="SOFTWARE\Microsoft\.NETFramework\InstallRoot" 
      hive="LocalMachine" /> 
     <readregistry 
      property="sdkInstallRoot" 
      key="SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.1\WinSDKNetFxTools\InstallationFolder" 
      hive="LocalMachine" 
      failonerror="false" /> 
     <property name="frameworkDirectoryV35" value="${path::combine(installRoot, 'v3.5')}" /> 
     <fail if="${not(directory::exists(frameworkDirectoryV35))}">The Framework directory for .NET 3.5 does not exist.</fail> 
     <property name="referenceV35" value="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/v3.5" /> 
     <fail if="${not(directory::exists(referenceV35))}">The Reference Assemblies directory for .NET 3.5 does not exist.</fail> 
    </project> 
    <tasks> 
     <task name="csc"> 
      <attribute name="exename">${path::combine(frameworkDirectoryV35,'csc.exe')}</attribute> 
      <attribute name="supportsnowarnlist">true</attribute> 
      <attribute name="supportswarnaserrorlist">true</attribute> 
      <attribute name="supportskeycontainer">true</attribute> 
      <attribute name="supportskeyfile">true</attribute> 
      <attribute name="supportsdelaysign">true</attribute> 
      <attribute name="supportsplatform">true</attribute> 
      <attribute name="supportslangversion">true</attribute> 
     </task> 
     <task name="vbc"> 
      <attribute name="exename">${path::combine(frameworkDirectoryV35,'vbc.exe')}</attribute> 
      <attribute name="supportsdocgeneration">true</attribute> 
      <attribute name="supportsnostdlib">true</attribute> 
      <attribute name="supportsnowarnlist">true</attribute> 
      <attribute name="supportskeycontainer">true</attribute> 
      <attribute name="supportskeyfile">true</attribute> 
      <attribute name="supportsdelaysign">true</attribute> 
      <attribute name="supportsplatform">true</attribute> 
      <attribute name="supportswarnaserrorlist">true</attribute> 
     </task> 
     <task name="jsc"> 
      <attribute name="supportsplatform">true</attribute> 
     </task> 
     <task name="vjc"> 
      <attribute name="supportsnowarnlist">true</attribute> 
      <attribute name="supportskeycontainer">true</attribute> 
      <attribute name="supportskeyfile">true</attribute> 
      <attribute name="supportsdelaysign">true</attribute> 
     </task> 
     <task name="resgen"> 
      <attribute name="supportsassemblyreferences">true</attribute> 
      <attribute name="supportsexternalfilereferences">true</attribute> 
     </task> 
     <task name="al"> 
      <attribute name="exename">${path::combine(sdkInstallRoot, 'bin/al.exe')}</attribute> 
     </task> 
     <task name="delay-sign"> 
      <attribute name="exename">sn</attribute> 
     </task> 
     <task name="license"> 
      <attribute name="exename">lc</attribute> 
      <attribute name="supportsassemblyreferences">true</attribute> 
     </task> 
    </tasks> 
</framework> 
1

J'ai fait la gestion de configuration avec et CC.Net Nant pendant un certain temps maintenant. D'après mon expérience, je ne recommanderais pas d'utiliser la tâche Nant MSBuild, mais plutôt de créer et de créer une tâche, de créer un fichier .bat que la tâche exécute. Il y a plusieurs raisons qui recommandent d'utiliser la ligne de commande Visual Studio, car les paquets MSI ne sont pas facilement construits avec Nant, même si vous utilisez contrib. C'est juste plus facile et beaucoup plus rapide de cette façon.

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

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

+0

Ne serait-il pas préférable d'appeler MSBuild dans le fichier batch? – AngryHacker

+0

Devenv, référence MSBuild pour créer les fichiers SLN. Il y a une différence subtile entre l'invocation de MSbuild Vs et Devenv. Notre équipe de développement est sur VS 2008 et l'invocation de la ligne de commande Devenv produit fondamentalement la même sortie que notre équipe de développement produirait. C'est la raison pour laquelle je l'ai choisi en invoquant simplement MSbuild, de cette façon, si quelque chose se brise, nous savons que nous comparons des pommes à des pommes et que nous pouvons au moins éliminer l'environnement de construction. Devenv serait un peu plus lent que la simple invocation de Msbuild, mais généralement pas beaucoup. –

+2

Toutefois, Devenv nécessite une installation de Visual Studio sur le serveur de construction. Pour des raisons de licence (et de simplicité), beaucoup de serveurs de build ont simplement installé le Framework, qui est tout ce qui est nécessaire pour construire les projets. En supposant que vous évitez les projets d'installation et de déploiement Web, ce qui devrait être évité pour plusieurs raisons de toute façon et utiliser des alternatives qui ne dépendent pas de Visual Studio pour la construction. – tjmoore