2010-06-12 3 views
2

После осмотра я не могу найти простой ответ на эту проблему.MSBuild: добавьте дополнительные файлы для компиляции без изменения файла проекта

Я пытаюсь создать файл MSBuild, чтобы я мог легко использовать SpecFlow и NUnit в Visual Studio 2010 express.

Файл ниже не является полным, это всего лишь доказательство концепции, и его необходимо сделать более универсальным.

<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> 

SpecFlow Задача выглядит в файле .csproj и создает SpecFlowFeature1.feature.cs. Мне нужно включить этот файл при создании .csproj, чтобы NUnit мог его использовать.

Я знаю, что могу изменить (прямо или на копию) файл .csproj, чтобы включить сгенерированный файл, но я бы предпочел избежать этого.

Мой вопрос: Есть ли способ использовать задачу MSBuild для создания файла проекта и сообщить ему о включении дополнительного файла для включения в сборку?

спасибо.

ответ

1

Я не мог придумать какой-либо способ достичь без каких-либо изменений в файле .csproj.

Подход, который я предлагаю, будет выглядеть следующим образом.

В вашем .csproj вы Import целевой контейнер файл

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

чуть выше CSharp.targets.

Specflow.targets будет выглядеть следующим образом

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

так это не вредит при построении проекта с VS.

Затем можно использовать выход вашего SpecFlowExec и добавить его в файл SpecFlow.targets

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

...

и чистые SpecFlow.targets после создания вашего .csproj.

3

Я не нашел способ сделать это без редактирования файла проекта.

Так что я сделал файл MSBuild для:

  • Скопируйте файлы проекта
  • Запустите копии через SpecFlow
  • Добавить новый.CS файлы скопированных проектов
  • Компиляция проектов
  • Debug Run каждый из скомпилированных библиотек DLL через NUnit
  • Очистка - удалить скопированные проекты

Я уже писал о том, как использовать его здесь :

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

(Это версия 1, я хотел бы улучшить сценарий)

+0

Я читал ваше сообщение в блоге и следил за всеми шагами, но это не работает для меня. В качестве примера я использовал стартовый сайт Tekpub MVC, и он не работает. Ошибка, которую я получаю, такова: «C: \ WebTest \ VS2010ExpressSpecFlow.xml» (цель по умолчанию) (1) -> (цель AddSpecFlowCSFilesToProject) -> C: \ WebTest \ VS2010ExpressSpecFlow.xml (86,5): ошибка : В экземпляре объекта не задана ссылка на объект. – WVDominick

+0

+1 за то, что нашли время, чтобы сделать это. – WVDominick

+0

Благодарим вас за то, что вы попали, и это то, что мне нужно. Я посмотрю на это, как только у меня будет время ... возможно, в эти выходные. –

Смежные вопросы