我正在编写一个自定义工具,我目前正在做我想要的功能.如果出现问题,我希望能够写入Visual Studio.(代码格式不正确或其他).
这有什么标准吗?现在我基本上可以强制该工具失败,Visual Studio会发出警告,表明它已经这样做了.我想在"输出"窗口中输入一个类别,其中包含我要发送的任何结果消息.我还可以在错误列表窗口中使用更具描述性的任务/警告.
我有~30个SpecFlow功能文件,我最近从源代码控制中删除了Foo.feature.cs文件,因为我厌倦了解决Designer Generated代码中的合并冲突.
我没有从Visual Studio项目中排除或删除这些文件,因此Visual Studio仍然认为它们应该在那里,它们只是在硬盘上丢失了.
理想情况下,我只想单击一个根文件夹并重新生成文件后面的所有代码,但VS 2010和SpecFlow 1.9不存在这样的选项.我甚至可以通过编程从命令行重新生成它们,创建另一个自定义工具或添加预编译构建事件.
有没有办法为SpecFlow功能(*.feature.cs文件)重新生成所有Designer生成的代码,而无需右键单击每个.feature文件并单击"运行自定义工具"?
我想隐藏我的自定义工具生成的文件,但我找不到任何关于如何完成此操作的文档.
我正在寻找的一个例子是文件背后的WPF代码.这些文件不会显示在Visual Studio项目视图中,而是使用项目进行编译,并在IntelliSense中可用.文件后面的WPF代码(例如,Window1.gics)由自定义工具生成.
问题
现有的不合标准解决方案
在每个文件上,每次添加它时,我都可以转到文件设置,将项目类型设置为自定义构建工具,然后在自定义构建工具对话框中,设置命令行参数,设置(硬编码)输出,以及设置(硬编码)其他依赖项.
显然,这是一个糟糕的解决方案,因为每次添加自定义类型的新文件时,这都是一项非常重要且容易出错的工作量.
理想的解决方案
我设置了visual studio,无论扩展名为.foo,它都会在.foo文件发生变化时运行工具bar.exe,然后再编译CPP代码.
我尝试过的事情
基于此:http://msdn.microsoft.com/en-us/library/3e889s84( v=vs.100) .aspx我试图设置.targets和.xml文件.但是,我无法找到如何创建一个新的项目类型,使其显示在visual studio中,我也无法弄清楚如何使它神奇地应用于.foo类型的每个文件.最重要的是,我还没有想到如何链接任何描述调用我的bar.exe工具的行为.
我试图搜索所有visual studio的xml /目标文件,以便跟踪现有的项类型并确定它们如何转换为实际的构建操作.它始终在ItemType的墙上结束,其中有一些在ProjectItemsSchema中描述,但我无法找到它们的实现位置,或者我自己如何实现它们.
MSDN的文档已经彻底失败了,我想我已经十次阅读每个可能相关的页面,但无济于事.
在visual studio 2008中,我有一个使用.rules文件的东西,看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="Foo Build Rules"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="FooBuild"
DisplayName="FooGen"
CommandLine="..\..\tools\FooGen.exe [inputs]"
Outputs="$(InputName).h"
AdditionalDependencies="*.foo"
FileExtensions="*.foo"
ExecutionDescription="Generating Foos..."
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
Run Code Online (Sandbox Code Playgroud)
然而,这个功能在2010年已被弃用,我一直无法弄清楚如何使用新系统复制它.
救命?
msbuild build-process code-generation visual-studio-2010 customtool
有没有办法在visual studio中为自定义工具创建快捷方式?目前我必须导航到解决方案中的工具,右键单击并运行自定义工具.如果我可以绑定快捷键或从工具栏运行该工具,那将是很好的.有谁知道这样做的方法?
有没有办法为整个解决方案"运行自定义工具"?
为什么?自定义工具正在开发中,当进行更改时,我需要刷新使用它的所有项目以确保没有任何中断.
当我编辑T4时,每次切换到另一个文件时都会执行脚本.对于快速简单的脚本是可以的,但是一些脚本需要很长时间才能执行.有没有办法禁用这种行为?我希望脚本只在我保存T4文件时运行或从菜单中手动选择"运行自定义工具".
我有T4模板(mycode.tt),它生成一个cs文件.我通常右键单击tt文件并选择RunCustomTool,它在内部获取xml文件并为我生成代码.现在我想使用ac #windows应用程序运行自定义工具.因此,只需单击一个按钮即可运行自定义工具.是否可以从c#运行CustomTool.
编辑:
我有2个tt文件,其中一个没有codebehind cs文件.但另一个附加了.cs文件,我从第一个.tt文件调用第二个文件的TransformText()方法.所以我需要调用第一个文件.所以我不能使用TransformText()方法.有没有办法动态调用textTemplate文件?
我有一个Visual Studio的"自定义工具",可以将一些模板文件转换为代码.为了保持一致性和可移植性,我希望能够在Visual Studio外部构建时从MSBuild运行此模板处理器.
Visual Studio为文件创建以下代码段:
<!-- the template -->
<None Include="Template.in">
<Generator>Template Processor</Generator>
<LastGenOutput>Template.in.Designer.cs</LastGenOutput>
</None>
<!-- generated file -->
<Compile Include="Template.in.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Template.in</DependentUpon>
</Compile>
Run Code Online (Sandbox Code Playgroud)
这里的问题Template.in
是它只由Studio处理,而不是由MsBuild处理,这可能导致过时的Designer.cs
文件.
是否存在可以IVsSingleFileGenerator
直接使用(包括从注册表加载其位置)的现有MSBuild任务,还是必须手动调用处理器(通过自己实现所述MSBuild任务或调整处理器)?
有趣的是,MSDN上的使用MSBuild文章说:
单个文件生成器只能在设计时访问,但MSBuild任务可以在设计时和构建时使用.因此,为了获得最大的灵活性,请使用MSBuild任务来转换和生成代码.有关更多信息,请参阅项目项(Visual Studio SDK).
更新:我已经将这个特定的自定义工具入侵到了msbuild任务中,但它并不漂亮.我仍然更喜欢维护良好的通用解决方案.我在我的博客上发布了这个来源.
我想尝试在Visual Studio中使用自定义工具时,可以更改一个文件的内容,触发另一个文件的自定义工具.
我的情况是这样的:
在Visual Studio C#项目中,我有一个"master.xsd"xml架构,其中包含其他几个其他xsd文件.我正在使用Xsd2Code Visual Studio自定义工具从架构生成.cs.当master.xsd本身发生变化时,这可以正常工作,但是当其他xsds之一发生变化时,我希望自定义工具在文件master.xsd上运行.
有没有办法让一个文件触发另一个自定义工具?
[编辑 - 有关我为什么要使用自定义工具的详细信息]
目前我们有一个GenerateFiles.bat文件,它从命令行调用Xsd2Code来生成模式中的代码(如下面的MattDavey所建议的).这个工作,太慢了.
问题在于,每次构建Xsd2Code都会运行,但是由于很多其他项目都依赖于这个带有模式的项目,所以即使可能没有任何改变,它们也会重新编译.实际结果是,即使对单元测试进行微小改动,也只有一半的项目重新编译.这就是为什么我们一直在寻找自定义工具方法,只有在架构发生变化时才生成代码文件.
customtool ×10
c# ×4
msbuild ×2
t4 ×2
bdd ×1
code-behind ×1
specflow ×1
vsx ×1
wpf ×1
xsd2code ×1