T4 代码需要库项目目录,但它使用库获取应用程序的目录,而不是

Posted

技术标签:

【中文标题】T4 代码需要库项目目录,但它使用库获取应用程序的目录,而不是【英文标题】:T4 code wants library project dir, but it gets the dir of the app using the library, instead 【发布时间】:2021-04-06 03:41:53 【问题描述】:

我正在编写一个供多个应用程序使用的 .NET Standard 库。在我的库项目中,我使用构建时 T4 模板来收集有关库的一些构建信息,以便可以在运行时访问它。我需要的信息之一是库项目的源(项目)目录。我想通过获取 CWD 然后从中推断库源目录来做到这一点。不幸的是,当我构建一个使用该库的应用程序时,我的库的 T4 代码将 CWD 视为应用程序的输出目录,而不是库。有没有办法让T4代码在建库的时候获取库的源代码工程目录?

【问题讨论】:

通常由可执行项目来管理工作目录——或者实际上是可执行文件的执行者。因此,在这种情况下,请转到 exe 项目的调试属性并将工作目录设置为项目文件夹。您应该能够使用像 $(ProjectDir) 这样的宏 【参考方案1】:

在一些更不成功的研究之后,我决定使用一个预构建事件来创建一个小的 C# 文件,该文件定义一个静态类,其中包含一个从 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 是两种不同的获取方式)

【讨论】:

以上是关于T4 代码需要库项目目录,但它使用库获取应用程序的目录,而不是的主要内容,如果未能解决你的问题,请参考以下文章

获取python项目使用的所有模块/包

动态链接库

单个目录指向多个git存储库

将 Fabric 答案添加到项目中的公共库

使用 HTTP URL 克隆存储库

超简单获取快应用摘要值