T4MVC с переносными площадями на TeamCity
У меня есть ситуация, когда у нас есть решение, которое использует Portable Areas и T4MVC, у которого есть отдельный проект для T4MVC, где все сгенерированные файлы для 7 переносных областей и основного приложения MVC3. Мы следовали инструкциям здесь, мы автоматически генерируем классы при построении решения.
Хотя в VS2010 все это прекрасно работает как в сборках Debug, так и в Release, но я сталкиваюсь с проблемами, где я пытаюсь заставить его работать на TeamCity.
Я следовал инструкциям по настройке T4 на сервере сборки здесь, и если запустить msbuild на сервере сборки, я вижу, что он может запустить TextTemplate.exe и посмотреть, чтобы сгенерировать файлы, проблема в том, что он никогда не находит файлы преобразовывать.
Мне удалось воспроизвести то же поведение на моем локальном компьютере при выполнении того же сценария сборки, что и в TeamCity.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<PropertyGroup>
<Configuration>Release</Configuration>
<TransformOnBuild>true</TransformOnBuild>
<TransformFile>T4MVC\T4MVC.tt</TransformFile>
<OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
</PropertyGroup>
<ItemGroup>
<None Include="T4MVC\T4MVC.tt">
<OutputFilePath>$(MSBuildProjectDirectory)\T4MVC</OutputFilePath>
</None>
</ItemGroup>
<ItemGroup>
<ProjectsToBuild Include="**\*proj" Exclude="ThemeGenerator\**" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
<Target Name="Clean">
<ItemGroup>
<BinFiles Include="*\bin\*.*" />
</ItemGroup>
<Delete Files="@(BinFiles)" />
</Target>
<Target Name="Build" DependsOnTargets="Clean;Transform">
<MSBuild Projects="@(ProjectsToBuild)"
ContinueOnError="false"
Properties="Configuration=$(Configuration)" />
</Target>
</Project>
Когда это выполняется, я получаю следующий вывод из msbuild с /v:diag set:
Building with tools version "4.0".
Target "CreateCandidateT4ItemList: (TargetId:2)" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" from project "C:\TeamCity\buildAgent\work\daad348639a87062\Project_Build.xml" (target "Transform" depends on it):
Using "Message" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Message" (TaskId:2)
Creating a list of candidate items that might need to be processed by T4 items (TaskId:2)
Done executing task "Message". (TaskId:2)
Using "CreateItem" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "CreateItem" (TaskId:3)
Done executing task "CreateItem". (TaskId:3)
Done building target "CreateCandidateT4ItemList" in project "Project_Build.xml".: (TargetId:2)
Target "SelectItemsForTransform: (TargetId:3)" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemp
lating.targets" from project "C:\TeamCity\buildAgent\work\daad348639a87062\Project_Build.xml" (target "Transform" depends on it):
Task "Error" skipped, due to false condition; ($(TransformFile)=='') was evaluated as (C:\TeamCity\buildAgent\work\daad348639a87062\T4MVC\T4MVC.tt=='').
Initializing task factory "CodeTaskFactory" from assembly "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll".
Using "FilterCandidatesBasedOnItemSpec" task from the task factory "Code Task Factory".
Task "FilterCandidatesBasedOnItemSpec" (TaskId:4)
Done executing task "FilterCandidatesBasedOnItemSpec". (TaskId:4)
Done building target "SelectItemsForTransform" in project "Project_Build.xml".: (TargetId:3)
Target "CreateT4ItemLists: (TargetId:4)" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" from project "C:\TeamCity\buildAgent\work\daad348639a87062\Project_Build.xml" (target "ExecuteTransformations" depends on it):
Task "Message" (TaskId:5)
Creating T4 items lists for project ()... (TaskId:5)
Done executing task "Message". (TaskId:5)
Done building target "CreateT4ItemLists" in project "Project_Build.xml".: (TargetId:4)
Target "ExecuteTransformations: (TargetId:5)" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" from project "C:\TeamCity\buildAgent\work\daad348639a87062\Project_Build.xml" (target "Transform" depends on it):
Using "TransformTemplates" task from assembly "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.Build.Tasks.dll".
Task "TransformTemplates" (TaskId:6)
Directive processors: (TaskId:6)
{none} (TaskId:6)
(TaskId:6)
Include folders: (TaskId:6)
{none} (TaskId:6)
(TaskId:6)
Assembly references: (TaskId:6)
{none} (TaskId:6)
(TaskId:6)
Reference paths: (TaskId:6)
{none} (TaskId:6)
(TaskId:6)
Parameter values: (TaskId:6)
{none} (TaskId:6)
(TaskId:6)
Full list of templates passed in : (TaskId:6)
{none} (TaskId:6)
(TaskId:6)
Performing full T4 transformation (TaskId:6)
MinimalRebuildFromTracking = True (TaskId:6)
forcedRebuildRequired = False (TaskId:6)
\tTrackerLogDirectory = <null> (TaskId:6)
Tracking is disabled. TrackerLogDirectory has not been specified (TaskId:6)
Done executing task "TransformTemplates". (TaskId:6)
Using "PreprocessTemplates" task from assembly "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.Build.Tasks.dll".
Task "PreprocessTemplates" (TaskId:7)
Directive processors: (TaskId:7)
{none} (TaskId:7)
(TaskId:7)
Include folders: (TaskId:7)
{none} (TaskId:7)
(TaskId:7)
Assembly references: (TaskId:7)
{none} (TaskId:7)
(TaskId:7)
Reference paths: (TaskId:7)
{none} (TaskId:7)
(TaskId:7)
Parameter values: (TaskId:7)
{none} (TaskId:7)
(TaskId:7)
Full list of templates passed in : (TaskId:7)
{none} (TaskId:7)
(TaskId:7)
Performing full T4 preprocessing (TaskId:7)
MinimalRebuildFromTracking = True (TaskId:7)
forcedRebuildRequired = False (TaskId:7)
\tTrackerLogDirectory = <null> (TaskId:7)
Tracking is disabled. TrackerLogDirectory has not been specified (TaskId:7)
Done executing task "PreprocessTemplates". (TaskId:7)
Похоже, что на сервере сборки T4 не может найти проекты, на которые он должен ссылаться для создания необходимых классов. Я пробовал различные комбинации входных папок и ссылок на сборки, но не смог заставить T4 "увидеть" нужные ему файлы.
У кого-нибудь есть идеи, как решить эту проблему?
2 ответа
Честно говоря, я не уверен, что вы можете заставить это работать вообще, потому что T4MVC нужен хост VS для доступа к объектной модели DTE. Смотрите эту связанную ветку: Использование T4MVC со скриптом сборки
Если Дэвид Эббо прав, запустите VS (devenv.exe) из командной строки на сервере сборки.
Например, вы не можете создавать проекты установщика.vdproj также с помощью msbuild, поэтому мы запускаем VS из командной строки на сервере сборки для сборки установщиков...