SpecFlow / MSBuild Codebehind Gen - Генерировать все задачи - PullRequest
1 голос
/ 15 октября 2019

В проекте, над которым я работаю, я поддерживаю некоторые функциональные тесты, написанные на SpecFlow. Наша команда начала использовать Visual Studio 2017 около года назад, и мы наконец-то нашли время для некоторого обслуживания наших тестов!

Наши тесты для проекта, над которым я работаю, изначально были написаны в SpecFlow 2.3.2 и последний раз обновлялись в Visual Studio 2015.

Известно, что SpecFlowSingleFileGenerator не работает наVS 2017, так что я потратил большую часть вчерашнего дня, изменяя наш пакет на использование MSBuildSingleFileGenerator вместо этого, как описано в этой статье в официальной документации SpecFlow

Проблема:
Локально, я могу построить свое решение, в том числе проект Feature Test. Тем не менее, я продолжаю получать следующую ошибку при попытке построить проект на нашем сервере сборки:

[exec]  C:\CheckoutDirectory\My Awesome Project\packages\SpecFlow.Tools.MsBuild.Generation.2.3.2\build\SpecFlow.Tools.MsBuild.Generation.targets(45,5): 
error MSB4036: The "GenerateAll" task was not found. 
Check the following: 
  1.) The name of the task in the project file is the same as the name of the task class. 
  2.) The task class is "public" and implements the Microsoft.Build.Framework.ITask interface. 
  3.) The task is correctly declared with <UsingTask> in the project file, or in the *.tasks files located in the "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin" directory. [C:\CheckoutDirectory\My Awesome Project\AwesomeProject.FeatureTest\AwesomeProject.FeatureTest.csproj]

Я должен отметить, что наша команда имеет опыт нет при написании задач MS Buildтак как до сих пор нам не нужно было;мы используем сценарии сборки NAnt в TeamCity для управления нашей работой по сборке. Понятно, что сообщение об ошибке было бы полезным ... если бы мы знали буквально что-нибудь об этом.

Теперь, как правило, правильным ответом будет: Google it. Я сделал это , и эта конкретная ошибка не имеет соответствующих результатов.

Кроме того, это блокирует мою команду, так как нам нужна наша сборка для работы. У меня нет времени на исследования и обучение, необходимые для правильного понимания работы технологии MS Build. Это придет позже.

Вопрос:
Учитывая, что SpecFlow нарушил наш процесс, и отсутствие у нашей команды знаний о системе MS Build: мне нужно знатькак обойти ошибку "GenerateAll" task was not found. Что мне делать, чтобы обойти это?

Вторичный вопрос:
Я также открыт для латерального мышления. Есть ли способ взломать VS 2017 или SpecFlow, чтобы сделать SpecFlowSingleFileGenerator «совместимым» друг с другом? Цель здесь - НЕ , чтобы избежать внесения изменений, но контролировать изменения. Мне нужен путь к переходу от старого генератора файлов к системе генерации сборки MS.

Дополнительная информация: Итак, я немного покопался и нашел место, где "GenerateAll"При вызове в файле SpecFlow.Tools.MsBuild.Generation.targets:

<Target Name="UpdateFeatureFilesInProject"  
        DependsOnTargets="BeforeUpdateFeatureFilesInProject"  
        Inputs="@(SpecFlowFeatureFiles)" Outputs="@(SpecFlowFeatureFiles->'%(RelativeDir)\%(Filename).feature.cs')">
  <GenerateAll
    ShowTrace="$(ShowTrace)"

    BuildServerMode="$(BuildServerMode)"
    OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"

    ProjectPath="$(MSBuildProjectFullPath)"
    ForceGeneration="$(ForceGeneration)"
    VerboseOutput="$(VerboseOutput)"
    DebugTask="$(SpecFlow_DebugMSBuildTask)" 
    >
    <Output TaskParameter="GeneratedFiles" ItemName="SpecFlowGeneratedFiles" />
  </GenerateAll>
</Target>

Поскольку я подтвердил , что это копируется на сервер сборки, ситуация еще более загадочная. Похоже, что пакет NuGet сносится верно. Поэтому я не могу понять, почему моя локальная копия ведет себя не так, как копия на сервере сборки.

1 Ответ

2 голосов
/ 16 октября 2019

Я не уверен, где вы нашли это утверждение:

Известно, что SpecFlowSingleFileGenerator не работает на VS 2017

SpecFlowSingleFileGenerator работает в VS2015, VS2017 иVS2019. Мы рассматриваем это как устаревшую функцию, но она все еще там. С некоторых недель он отключен по умолчанию, но вы можете включить его в настройках.

enter image description here

Работает для SpecFlow> = 2.3.2 и 2.4,Для SpecFlow 3 вы должны использовать интеграцию MSBuild. Есть некоторые проблемы со старыми версиями SpecFlow, но с ними он также может работать. Это зависит от вашей настройки.


Об ошибке MSBuild:

Задача MSBuild для SpecFlow <3.0 находится в specflow.exe. Это на вашем сервере сборки? Он является частью <code>SpecFlow пакетов NuGet. Обычно вы получаете такую ​​ошибку, если MSBuild не может найти сборку, в которой находится задача.

Для «отладки» проблем с MSBuild я настоятельно рекомендую использовать MSBuild Structured Log Viewer (http://msbuildlog.com/). С его помощью это легко сделать, так что смотрите, что происходит в вашей сборке.

У нас есть пример для MSBuild Code- Behind- Generation с SpecFlow 2.3.2 здесь: https://github.com/techtalk/SpecFlow-Examples/tree/master/MSBuild/OldCSProj_SpecFlow232

Вы можете сравнить ваш проект с этим примером.


Полное раскрытие: я один из сопровождающих SpecFlow.

...