Как вы получаете доступ к публикации информации в текстовом шаблоне T4? - PullRequest
0 голосов
/ 05 сентября 2018

Как получить доступ к информации публикации для использования в текстовом шаблоне T4?

Например, я хочу создать текстовый шаблон, который генерирует XML-файл, который будет опубликован на веб-сайте ASP.Net Core MVC. Сгенерированный файл должен отличаться в зависимости от того, где я публикую сайт; Производственная или испытательная среда. Таким образом, я хотел бы иметь что-то подобное в файле .tt, чтобы при его создании оно варьировалось в зависимости от выбранного профиля публикации или пути публикации:

<#
 if(publishing to A)
{
#>
   text output specific to A
<#
}
else if(publishing to B)
{
#>
   text output specific to B
<#
}
#>

EDIT: Я только нашел это, и это выглядит многообещающим: с помощью MSBuild-свойства-стенные-t4-шаблоны

1 Ответ

0 голосов
/ 24 октября 2018

Этот блог MSDN Джереми Кюна и этот блог Томаса Левеска и несколько других ссылок, таких как Документ MSDN , помогли ему работать в VS2017.

Мне не нужно было ничего добавлять в начало файла .csproj, поскольку в VS2017 файлы уже включены по умолчанию.

В Visual Studio 2017 компонент преобразования текстового шаблона автоматически устанавливается как часть расширения Visual Studio рабочая нагрузка Вы также можете установить его из Индивидуального Вкладка «Компоненты» установщика Visual Studio под инструментами «Код» категория. Установите компонент Modeling SDK из Индивидуального вкладка "Компоненты".

Я закончил со следующими изменениями .csproj в конце файла. Это позволит использовать выбранную конфигурацию сборки в шаблоне T4 и заставить все шаблоны повторно генерироваться в каждой сборке:

  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <!-- Run the Transform task at the start of every build -->
    <TransformOnBuild>true</TransformOnBuild>
    <!-- -->
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <!-- Transform every template every time -->
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
  </PropertyGroup>

  <!-- add AFTER import for $(MSBuildToolsPath)\Microsoft.CSharp.targets -->
  <Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

    <ItemGroup>
    <T4ParameterValues Include="BuildConfiguration">
        <Value>$(Configuration)</Value>
        <Visible>False</Visible>
    </T4ParameterValues>
  </ItemGroup>

    <Target Name="CreateT4ItemListsForMSBuildCustomTool" BeforeTargets="CreateT4ItemLists" AfterTargets="SelectItemsForTransform">
    <ItemGroup>
        <T4Transform Include="@(CreateT4ItemListsInputs)" Condition="'%(CreateT4ItemListsInputs.Generator)' == 'MSBuild:TransformAll'" />
    </ItemGroup>
  </Target>

Это то, что находится вверху файла csproj, но его можно настроить через VS2017. Ключевыми моментами являются пользовательская конфигурация сборки с именем Development и определенная константа DEVELOPMENT:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <Configurations>Debug;Release;Development</Configurations>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Development|AnyCPU'">
    <DebugType>none</DebugType>
    <DefineConstants>TRACE;DEVELOPMENT</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>full</DebugType>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <DebugType>none</DebugType>
    <DefineConstants>TRACE;RELEASE</DefineConstants>
  </PropertyGroup>

Это в шаблоне T4, чтобы показать, как получить доступ к новому параметру BuildConfiguration:

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#  
    //Build time.
    string configName = Host.ResolveParameterValue("-", "-", "BuildConfiguration");
    if (string.IsNullOrWhiteSpace(configName))
    {
        try
        {
            //Design time.
            var serviceProvider = (IServiceProvider)Host;
            EnvDTE.DTE dte = (EnvDTE.DTE)serviceProvider.GetService(typeof(EnvDTE.DTE));
            configName = dte.Solution.SolutionBuild.ActiveConfiguration.Name;
        }
        catch(Exception ex)
        {
            configName = ex.Message;
        }
    }
#>
<#=configName#>

Следующие настройки свойств файла .tt:

Build Action: None
Copy to Output Directory: Do Not Copy
Custom Tool: MSBuild:TransformAll

И пользовательская конфигурация сборки под названием "Разработка". Код в шаблоне T4 подберет «Отладка», «Релиз» и «Разработка». Конфигурация сборки разработки является копией конфигурации выпуска. Проект имеет условный символ компиляции «РАЗРАБОТКА», так что следующий код работает в Program.cs для перевода среды в режим разработки. Символ можно установить в разделе «Свойства проекта»> «Сборка»> «Общие». Профиль публикации настроен на публикацию URL-адреса тестового сервера с конфигурацией сборки разработки.

    public static void Main(string[] args)
    {
        //https://andrewlock.net/how-to-set-the-hosting-environment-in-asp-net-core/
            string mode = "";

#if DEVELOPMENT
            mode  = "DEVELOPMENT";
#elif DEBUG
            mode = "DEBUG";
#elif RELEASE
             mode = "RELEASE";
#endif

            switch (mode.ToUpper())
            {
                case "DEVELOPMENT":
                //Programmatically force the application to use the Development environment.
                    CreateWebHostBuilder(args).UseEnvironment("Development").Build().Run();
                    break;
                default:
                    CreateWebHostBuilder(args).Build().Run();
                    break;
            }
    }
...