T4 代码需要库项目目录,但它使用库获取应用程序的目录,而不是
T4 code wants library project dir, but it gets the dir of the app using the library, instead
我正在编写供多个应用程序使用的 .NET Standard 库。在我的库项目中,我使用构建时 T4 模板来收集有关库的一些构建信息,以便可以在 运行 时间访问它。我需要的信息之一是库项目的源(项目)目录。我想通过获取 CWD 然后从中推断库源目录来做到这一点。不幸的是,当我构建一个使用该库的应用程序时,我的库的 T4 代码将 CWD 视为应用程序而不是库的输出目录。有没有办法让T4代码在每次建库的时候都能获取到库的源码工程目录?
经过一些不成功的研究,我决定使用一个预构建事件来创建一个小的 C# 文件,该文件定义一个静态 class 以及从 CWD 分配的成员。
编辑:
...但这不适用于 Linux 和 Windows,因为 shell cmd 不同。正确的方法是创建一个输出 C# 文件的 T4 构建模板,如下所示:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>
using System;
namespace BC.LocationEngine
{
public static class VersionInfo
{
public static string BuildTime = @"<#=DateTime.Now #>";
public static string BuildPath = @"<#=Host.ResolvePath(".")#>";
public static string BuildDir = @"<#=Path.GetDirectoryName(this.Host.TemplateFile)#>";
}
}
注意'hostspecific="true"。
然后将 C# 文件添加到您的项目中。
(BuildPath和BuildDir是两种不同的获取方式)
我正在编写供多个应用程序使用的 .NET Standard 库。在我的库项目中,我使用构建时 T4 模板来收集有关库的一些构建信息,以便可以在 运行 时间访问它。我需要的信息之一是库项目的源(项目)目录。我想通过获取 CWD 然后从中推断库源目录来做到这一点。不幸的是,当我构建一个使用该库的应用程序时,我的库的 T4 代码将 CWD 视为应用程序而不是库的输出目录。有没有办法让T4代码在每次建库的时候都能获取到库的源码工程目录?
经过一些不成功的研究,我决定使用一个预构建事件来创建一个小的 C# 文件,该文件定义一个静态 class 以及从 CWD 分配的成员。
编辑:
...但这不适用于 Linux 和 Windows,因为 shell cmd 不同。正确的方法是创建一个输出 C# 文件的 T4 构建模板,如下所示:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>
using System;
namespace BC.LocationEngine
{
public static class VersionInfo
{
public static string BuildTime = @"<#=DateTime.Now #>";
public static string BuildPath = @"<#=Host.ResolvePath(".")#>";
public static string BuildDir = @"<#=Path.GetDirectoryName(this.Host.TemplateFile)#>";
}
}
注意'hostspecific="true"。
然后将 C# 文件添加到您的项目中。
(BuildPath和BuildDir是两种不同的获取方式)