2010-06-12 8 views
2

Après avoir regardé autour, je ne trouve pas de réponse simple à ce problème. Je tente de créer un fichier MSBuild pour me permettre d'utiliser facilement SpecFlow et NUnit dans Visual Studio 2010 express.MSBuild: Ajouter des fichiers supplémentaires à compiler sans modifier le fichier de projet

Le fichier ci-dessous n'est pas complet Ceci est juste une preuve de concept et il doit être rendu plus générique.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <PropertyGroup> 
     <BuildDependsOn> 
      BuildSolution;   
      SpecFlow; 
      BuildProject;   
      NUnit; 
     </BuildDependsOn> 
    </PropertyGroup> 

    <PropertyGroup> 
     <Solution>C:\Users\Craig\Documents\My Dropbox\Cells\Cells.sln</Solution> 
     <CSProject>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\Configuration.csproj</CSProject> 
     <DLL>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\bin\Debug\Configuration.dll</DLL> 
     <CSFile>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\SpecFlowFeature1.feature.cs</CSFile> 
    </PropertyGroup> 

    <Target Name="Build" DependsOnTargets="$(BuildDependsOn)"> 
     <Message Text="Build Started" Importance="high" /> 
     <Message Text="Build Ended" Importance="high" /> 
    </Target> 

    <Target Name="BuildSolution"> 
     <Message Text="BuildSolution Started" Importance="high" /> 
      <MSBuild Projects="$(Solution)" Properties="Configuration=Debug" /> 
     <Message Text="BuildSolution Ended" Importance="high" /> 
    </Target> 

    <Target Name="SpecFlow"> 
     <Message Text="SpecFlow Started" Importance="high" /> 
      <Exec Command='SpecFlow generateall "$(CSProject)"' /> 
     <Message Text="SpecFlow Ended" Importance="high" /> 
    </Target> 

    <Target Name="BuildProject"> 
     <Message Text="BuildProject Started" Importance="high" /> 
      <MSBuild Projects="$(CSProject)" Properties="Configuration=Debug" /> 
     <Message Text="BuildProject Ended" Importance="high" /> 
    </Target> 

    <Target Name="NUnit"> 
     <Message Text="NUnit Started" Importance="high" /> 
      <Exec Command='NUnit /run "$(DLL)"' /> 
     <Message Text="NUnit Ended" Importance="high" /> 
    </Target> 
</Project> 

Le SpecFlow Task recherche dans le fichier .csproj et crée un SpecFlowFeature1.feature.cs. Je dois inclure ce fichier lors de la construction du fichier .csproj afin que NUnit puisse l'utiliser.

Je sais que je pourrais modifier (directement ou sur une copie) le fichier .csproj pour inclure le fichier généré mais je préférerais éviter cela.

Ma question est: Existe-t-il un moyen d'utiliser la tâche MSBuild pour générer le fichier de projet et lui dire d'inclure un fichier supplémentaire à inclure dans la construction?

Merci.

Répondre

1

Je ne pouvais pas penser à un moyen de réaliser sans aucune modification au fichier .csproj.

L'approche que je suggérerais ressemblerait à ceci.

Dans votre .csproj vous Import un fichier cible conteneur

... 
<Import Project="SpecFlow.target" /> 
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
... 

juste au-dessus des CSharp.targets.

Specflow.targets ressembleraient cette

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <Compile Include="@(Compile)" /> 
    </ItemGroup> 
</Project> 

il ne nuit pas pendant la construction du projet de VS.

Vous pouvez ensuite utiliser la sortie de votre SpecFlowExec et l'ajouter au fichier SpecFlow.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <Compile Include="@(Compile)" /> 
     <Compile Include="SpecFlowFeature1.feature.cs" /> 
    </ItemGroup> 
</Project> 

...

et SpecFlow.targets propres après la construction de votre .csproj.

3

Je n'ai trouvé aucun moyen de le faire sans éditer le fichier de projet.

Je fait un fichier MSBuild à:

  • Copiez les fichiers du projet
  • Exécuter les copies par SpecFlow
  • Ajouter nouveau.cs fichiers aux projets copiés
  • compiler les projets
  • débogage Exécuter chacune des DLL compilées par NUnit
  • Nettoyer - Supprimer les projets copiés

J'ai blogué sur la façon de l'utiliser ici :

http://learntdd.wordpress.com/2010/06/10/using-specflow-and-nunit-on-visual-studio-2010-express/

(sa version 1, je voudrais améliorer le script)

+0

J'ai lu votre article de blog et j'ai suivi toutes les étapes, mais ça ne marche pas pour moi. A titre d'exemple, j'ai utilisé le site de démarrage Tekpub MVC et cela ne fonctionne pas. L'erreur que j'obtiens est la suivante: "C: \ WebTest \ VS2010ExpressSpecFlow.xml" (cible par défaut) (1) -> (cible AddSpecFlowCSFilesToProject) -> C: \ WebTest \ VS2010ExpressSpecFlow.xml (86,5): erreur : La référence d'objet n'est pas définie à une instance d'un objet. – WVDominick

+0

+1 pour avoir pris le temps de le faire. – WVDominick

+0

Merci d'avoir essayé, d'avoir frappé les gens, c'est ce dont j'avais besoin. J'y jetterai un coup d'oeil dès que j'en aurai le temps ... probablement ce week-end. –

Questions connexes