MSBuild: добавление дополнительных файлов для компиляции без изменения файла проекта - PullRequest
2 голосов
/ 13 июня 2010

Посмотрев вокруг, я не могу найти простой ответ на эту проблему.

Я пытаюсь создать файл 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 для создания файла проекта и указать, чтобы он включал дополнительный файл для включения в сборку?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

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

Итак, я сделал файл MSBuild для:

  • Копирование файлов проекта
  • Запускать копии через SpecFlow
  • Добавить новые файлы .cs в скопированные проекты
  • Скомпилируйте проекты
  • Отладка. Запустите каждую из скомпилированных библиотек через NUnit
  • Очистить - Удалить скопированные проекты

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

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

(это версия 1, я бы хотел улучшить скрипт)

1 голос
/ 14 июня 2010

Я не мог придумать ни одного способа достичь без каких-либо изменений в файле .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.

Затем вы можете использовать выходные данные вашего SpecFlow Exec и добавить его в файл 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...