Невозможно ссылаться на сборки зависимостей в шаблоне T4 при использовании TransformOnBuild - PullRequest
2 голосов
/ 04 мая 2011

Мы пытаемся использовать T4 с Visual Studio 2010 (SP1) для создания сценариев для другого языка, основанного на некоторых из наших существующих классов C #. Я надеюсь на следующее:

  1. Шаблон должен загрузить нашу существующую сборку и использовать объекты из пространства имен в этой сборке.
  2. Преобразование должно выполняться на каждой сборке на каждой машине разработки и на сервере сборки без каких-либо дополнительных установок.
  3. (1) и (2) должны работать вместе.

(1) было довольно просто:

<#@ assembly name="$(TargetDir)RequiredProject.dll" #>
<#@ import namespace="RequiredProject.RequiredNamespace" #>

Использование макроса $(TargetDir) позволило мне ссылаться на dll с полностью определенным UNC-путем (согласно инструкциям , найденным здесь ).

(2) - немного обходной путь, но я думаю, что я решил его: я установил необходимые для преобразования текста SDK 1020 * на другой компьютер и скопировал требуемые .targets и .dll в папку в моем решении, а затем обновил мой файл .csproj для ссылки на локальный файл .targets.

(3) я сталкиваюсь с проблемами. Кажется, что свойство <TransformOnBuild>true</TransformOnBuild> не очень хорошо работает, когда сборка, на которую ссылаются, должна быть построена до преобразования. Каждый раз, когда я включаю преобразование при сборке со ссылочными сборками, я получаю следующую ошибку:

Compiling transformation: Metadata file '$(TargetDir)RequiredProject.dll' could not be found.

Однако я использую ту же инструкцию по сборке, что и в (1), для ссылки на сборку. Фактически, прямой переход к шаблону .tt и его сохранение все еще дает ожидаемый результат - он просто не работает на этапе «сборки». Я делаю что-то не так или есть способ обеспечить преобразование шаблона после сборки, от которой они зависят? (Или, проще говоря, преобразования шаблона происходят last ?)

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

К сожалению, хост msbuild T4 еще не поддерживает встроенные макросы или переменные msbuild в именах сборок.

Тем не менее, он поддерживает переменные среды Windows "% foo%", поэтому, хотя это означает некоторую настройку на уровне компьютера, вы можете получить что-то, что работает в in-IDE и преобразованиях времени сборки.

1 голос
/ 19 декабря 2013

Насколько я понимаю, Visual Studio 2013, наконец, решит эту проблему , но это не очень хорошо для меня, так как я все еще на Visual Studio 2012. После долгих усилий я наконец наткнулся раствор .

В проекте с шаблоном, который вы хотите запустить, добавьте следующее в качестве шага перед сборкой на вкладке События сборки на странице свойств проекта.

set textTransformPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe"
if %textTransformPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe" set textTransformPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe"
set ProjectDir=$(ProjectDir)
%textTransformPath% "%ProjectDir%StringGenerator.tt"

Первые две строки учитывают различия между расположением TextTransform.exe в 32-разрядных и 64-разрядных системах. Третья строка - это ключ. Мне нужен путь к местоположению проекта внутри моего шаблона, поэтому я установил локальную переменную среды, равную значению свойства $(ProjectDir) сборки. Внутри моего шаблона просто используйте следующее:

var projectDir = Environment.GetEnvironmentVariable("ProjectDir");

Это решило мою проблему.

0 голосов
/ 07 мая 2011

Я создал отдельное решение, которое содержало мои необходимые ссылочные сборки. Сначала мой buildscript собрал эталонное решение, затем преобразовал шаблоны, а затем собрал решение, содержащее сгенерированный код.

...