Этот блог 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;
}
}