如何从t4模板中获取对visual studio项目或解决方案目录或t4模板目录的引用?
我有一个模板将一些文件连接在一起,这些文件位于相对于模板的位置.我需要通过相对手段获得对绝对位置的引用.硬编码绝对路径是不可接受的,因为visual studio项目并不总是在同一位置,这会破坏代码生成.从环境中读取当前工作目录也不起作用,因为它返回T4引擎所在的位置而不是模板.我刚刚进入t4,所以任何帮助都会受到赞赏.
我正在尝试将一些代码生成模板连接到我的团队的自动构建过程.我们的SCM团队不希望在我们的构建机器上使用Visual Studio(我很难与之争论).
有没有办法在没有Visual Studio的情况下安装T4引擎?
我们在Visual Studio 2013中有一个数据库项目.在这个项目中,我们有一个生成.sql脚本的.tt文件.问题是在生成之后,生成的文件的构建操作自动设置为Build.如果我们手动将其更改为None,则会在重新生成(运行自定义工具)后重置为Build.
另一个奇怪的事情是,只有当.tt文件在数据库项目中并且在该项目的某个文件夹中(不在root中)时才会发生.如果.tt文件位于另一个项目(任何地方)或数据库项目的根目录中,则生成文件的构建操作在重新生成后不会更改.
我们没有任何Visual Studio加载项,我尝试禁用可能被禁用的所有扩展和更新.
如果需要,我会给你任何细节.
我有一个VS项目,其中包含:
TextTransform在a template.tt上运行的预构建操作以生成generated.cs
generated.cs 列为要编译的文件之一(即在项目文件列表中)
当我构建项目时,执行预构建操作,generated.cs重新创建,但VS编译以前的版本generated.cs(我猜它在构建过程开始时加载到内存中).
如何使构建使用新版本generated.cs(即在预构建操作中生成的版本)?如何强制构建订单?
请注意,文本转换输入是动态的,因此无法在设计时完成.
当我构建我的c#解决方案时,.tt文件将不会创建.cs文件输出.但是,如果我在解决方案资源管理器中一次单击一个.tt文件并选择"运行自定义工具",则会生成.cs,因此构建工具设置是正确的.如何才能使整个解决方案构建强制自定义工具在.tt文件上运行?
我最近将测试项目迁移到.NET Core 2.0.该测试项目使用文本模板生成一些重复的代码.之前的项目有一个构建目标,可以在构建之前生成所有T4模板.因此,生成的代码也不会签入VCS.
我在项目中使用了这个片段来确保构建模板:
<PropertyGroup>
<!-- Default VisualStudioVersion to 15 (VS2017) -->
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<!-- Determinate VSToolsPath -->
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<!-- Run T4 generation if there are outdated files -->
<TransformOnBuild>True</TransformOnBuild>
<TransformOutOfDateOnly>True</TransformOutOfDateOnly>
</PropertyGroup>
<!-- Import TextTemplating target -->
<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />
Run Code Online (Sandbox Code Playgroud)
我的第一个方法是保留这个片段并将其复制到新的.NET Core项目文件中.
在Visual Studio中,这很有效,因为显然,VSToolsPath设置正确.但是,当我运行.NET Core SDK工具时dotnet test(例如我在构建服务器上),VSToolsPath映射到Program Files\dotnet\sdk\2.0.3那里,无法找到文本模板目标.
因为这不起作用,我也尝试简单地Microsoft.VisualStudio.TextTemplating从Nuget 安装包,但这有两个问题:
刚刚安装了2010 Express Edition,我无法看到Preprocess t4模板作为选项.2010 Express不支持吗?
我刚刚下载了sharparchitecture/Northwind,我正在努力让crud脚手架工作.除了添加对此类库的缺少引用之外,我什么都没做.我尝试运行ScaffoldingGeneratorCommand.tt,然后点击3个错误.
错误1编译转换:类,结构或接口成员声明文件中的标记'this'无效:BaseTemplate.tt
错误2编译转换:类,结构或接口方法必须具有返回类型文件:BaseTemplate.tt
错误3编译转换:键入预期文件:BaseTemplate.tt
编译器说它们出现在BaseTemplate.tt的第一行,但我不认为这是真正的原因.
有人有这个问题吗?你知道我该怎么做才能解决它吗?
非常感谢你的时间,PK
我正在尝试设置一个进程,我的T4模板将在构建服务器上进行转换(Visual Studio未安装在那里).
我已经阅读了所有在线参考文献,但无法获得显示如何执行此操作的明确来源.
具体来说,这是我遇到的两个问题:
C:\ TeamCity的\ buildAgent \工作\ AppSettings.tt(0,0):错误CS0006:编译转型:元数据文件"Microsoft.VisualStudio.TextTemplating.Interfaces.10.0,版本= 10.0.0.0,文化=中立,公钥= b03f5f7f11d50a3a '无法找到
使用gacutil注册DLL文件修复了这个问题,虽然我想避免这一步.
此方法有助于确定模板用作其数据源的.txt文件的完整路径.没有它,无法在构建服务器上找到此文件.
任何帮助将在运行中受到赞赏.
编辑:打开一个MS CONNECT问题:https://connect.microsoft.com/VisualStudio/feedback/details/744137/texttransform-exe-does-not-work-without-vs2010-installed
参考资料我检查过:
问题是:有没有办法在*.tt文件中设置一个设置,以便生成的文件设置为指定的Build Action?
问题是我使用模板生成代码,但它只是一个起点,消除了大量的输入.我不希望任何人按原样使用代码(生成的类),也不希望它混淆命名空间.目前,每次模板添加新文件时,我都必须手动将Build Action设置为None - 我想自动化它.
谢谢!