Typescript: Visual Studio“不编译”选项

创建于 2015-03-11  ·  29评论  ·  资料来源: microsoft/TypeScript

你好

我们最近为grunt-ts插件开发了一个增强功能,该功能允许将Visual Studio项目文件作为输入TS文件路径和TS配置信息的目标,而不必使用src:和其他选项。 https://github.com/TypeStrong/grunt-ts/pull/215

Grunt-ts与Task Runner Explorer一起使开发人员能够使用Visual Studio TypeScript项目构建配置UI尚不支持的功能(例如preserveConstEnums)。

使用Task Runner Explorer的一件事是它只能挂接到某些Visual Studio事件中。 其中包括“构建后”和“构建前”。 生成后效果很好,但是VS奇怪的问题是VS完成了自己的TypeScript编译步骤,然后是grunt-ts调用tsc。 除性能外,这似乎不是问题(VS所做的工作是浪费精力,开发人员不得不等待更长的时间才能获得所需的结果)。

我想知道对我们来说最好的方法是关闭Visual Studio中TypeScript的编译/发出功能,但保持其他所有功能不变(语言服务/语法突出显示,错误列表,C#或VB生成等)。 目前甚至可能吗? 如果没有,那会是吗?

谢谢!

Question

最有用的评论

仅供参考,在VS2015 RTM中,有一种更简单的方法来禁用TypeScriptCompile:
只需将<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>.csproj ,例如在第一个<PropertyGroup>

所有29条评论

嗨,几天前,我提交了与此问题有些相关的问题#2252。 当对具有单个文件输出的TS项目使用保存时编译时,我需要某种方式来触发构建前和构建后事件(同时仍保持常规的VS“构建”和“重建”命令,语言服务,调试等) )。 作为一种解决方法,我目前正在使用带有grunt-contrib-watch(使用“ Solution Open”的绑定启动)的Task Runner Explorer,以监视编译文件的更改并在每次修改后执行其他操作。

但是,我没有真正满足的要求(我还需要执行一些预编译操作,并且通常更喜欢使用Grunt或全部使用VS完成构建步骤),并考虑完全按照说明进行操作:完全关闭VS编译并结合grunt-contrib-watch,grunt-ts,其他grunt插件和Task Runner Explorer来实现自定义保存时编译,完整构建(包括正在运行的单元测试等),构建前和构建后事件。 。

(更新:已经实现,并且可以正常工作-每次修改.ts文件时,它都会运行一个自定义的grunt构建脚本,尽管当前它不支持TRE“构建前”和“构建后”绑定-对于上述内容原因)。

看来,最有效(允许TS插件开发人员参与的最简单方法)有效地允许这类构建方案的方法是提供一个选项,以关闭由Visual Studio启动的任何形式的编译。 我也将对如何做到这一点的任何想法表示赞赏?

我不知道您现在是否有个不错的选择。 如果将项目中的每个.ts文件设置Build Action: None在属性中具有

生成是由MSBuild项目中的目标派生的。 如果要禁用默认的打字稿构建,请从文件中删除对打字稿目标的引用。

这将使您的语言服务不会在一个上下文中收集项目中的所有文件。 我会说这很好,到下一个发行版,我们应该有了tsconfig支持,然后成为您的新项目。 如果仍要使它在不使用tsconfig的情况下工作和/或等待下一个版本,请在项目文件中定义属性<TypeScriptEnabled>true</TypeScriptEnabled>

@mhegazy您的意思是<TypeScriptEnabled>false</TypeScriptEnabled>吗?

很好,取决于你想要什么:)

如果您要关闭语言服务项目的内容加载,请将其设置为false,
如果要启用它,请将它设为true。 通过包括默认目标(Microsoft.TypeScript.targets)已启用它

好吧,我会把它弄乱的。 谢谢!

感谢@mhegazy

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
...
    <TypeScriptEnabled>false</TypeScriptEnabled>
...
</PropertyGroup>

我不确定“禁用语言服务项目内容加载”是什么意思? (我对目标,上下文等VS概念不是很熟悉)。 据我测试,此选项似乎一切正常(除了未在构建时进行编译的预期行为)? 而且看起来它仍将在项目配置中为新添加/创建的.ts文件添加<TypeScriptCompile Include=".."/>条目。

附带说明一下,现在通过Grunt完成所有工作后,我不知何故必须找到一种方法来处理调用VS Build时grunt-watch触发的构建与“ Before Build” /“ After Build”绑定事件之间的冲突Rebuild命令,因为VS在构建开始之前自动保存,从而导致两个不同的Grunt实例不必要地并行运行。

我无法使<TypeScriptEnabled>false</TypeScriptEnabled>能够正常工作(带有TypeScript 1.4的VS 2013 Update 4),但是从项目中删除TypeScript目标文件确实禁用了项目Build上的编译。

这是在VS中禁用TypeScript编译所需的完整步骤(尽管仍然可以使用语言服务,请继续进行重构,等等):

  • 从项目文件中删除对TypeScript“ .targets”文件的引用。
  • 在Visual Studio TypeScript选项中禁用“自动编译不属于项目的TypeScript文件”。

第二步是某种错误(或者至少该对话框没有以严格准确的方式标记); 即使您的TypeScript文件是项目的“一部分”,如果禁用目标文件,Visual Studio 2013也会将它们视为项目的一部分,并在保存时进行编译(如果未设置global选项)。 我什么也做不了<TypeScriptEnabled/>

@mhegazy ,谢谢-如果它可以作为TypeScript选项对话框的一部分,那将很棒,但是至少通过项目编辑来支持它相当容易。

一件棘手的事情是, <TypeScriptEnabled>false</TypeScriptEnabled>必须在文件末尾,特别是在导入到目标之后。 因为目标仍会定义它,而您想覆盖它。

一件棘手的事情是需要在文件的末尾,特别是在导入到目标之后。 因为目标仍会定义它,而您想覆盖它。

你说的没错! 这就是窍门。

我认为这解决了问题。 谢谢, @mhegazy

嗨, @ mhegazy-麻烦您了。 您确定<TypeScriptEnabled>false</TypeScriptEnabled>可以在安装了TypeScript 1.4的VS 2013中使用吗? 我刚刚将当前的PC从带有TS 1.3的VS 2013(直接VS 2013 Update 4)升级到了带有TS 1.4的VS 2013,现在Visual Studio尝试再次“在构建时”构建TypeScript(这意味着出现的错误为“ Build” :”),即使我的项目的最后五行如下所示:

  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  <PropertyGroup>
    <TypeScriptEnabled>false</TypeScriptEnabled>
  </PropertyGroup>
</Project>

今天早些时候(当我关闭这张票时),它在这台机器上正常工作,但是现在我在这里放了1.4,VS的Build给我错误。 注释掉对目标文件的引用(并为不在项目中的TypeScript关闭“编译时保存”)仍然会禁用它。

我家里有1.4,我在那里根本无法获得<TypeScriptEnabled>false</TypeScriptEnabled>的工作能力-我想知道此构建选项是否存在回归?

<TypeScriptEnabled>false</TypeScriptEnabled>与构建无关。 语言服务全都与将文件视为项目的一部分有关。

如果您不想在F5上构建,请删除对目标的引用。

那是一个简短的答案,这是一个长版本:

该项目文件用于两件事:

  1. 构建,这是您正常的MSBuild支持,目标调用任务,系统查找输入,匹配目标并按顺序执行它们。 因此,此操作将聚合项目中的所有TypeScriptCompile项,并将它们与一些选项一起传递给tsc.exe。
    此外,“项目”属性页是从您的项目文件派生的,并且只是基于MSBuild属性的UI。
  2. 语言服务,您的完成情况,签名帮助,VS中的错误,保存时进行编译等。我们希望这些功能以您正常构建的方式工作,因此,我们查找了为构建定义的相同属性,并驱动LS行为。 例如,如果您在项目文件( <TypeScriptTarget>ES3</TypeScriptTarget> )中将目标设置为ES3,则在类中定义get / set时,语言服务将为您提供红色的花样。
    这使您可以对构建和设计时行为使用一组选项。
    为此,目标通过定义属性<TypeScriptEnabled>true</TypeScriptEnabled>告知语言服务有关打字稿的知识。

如果您不想在VS中进行构建,只需删除目标即可。 这将禁用构建,但还会告诉LS该项目不是TypeScript项目。 然后它将所有文件视为“松散文件”。 如果您可以接受,则无需进行其他工作。 如果要更改它并使其仍使用项目文件中的属性,并且不包括在项目中打开的其他文件等,则在文件中添加<TypeScriptEnabled>true</TypeScriptEnabled> ,然后LS会对其进行相应处理。

如果要使构建在VS中工作,但LS不要将其视为项目,则将标志设置为false。

谢谢。 这是非常有用的信息,一切似乎都与您所描述的保持一致。 如果我删除了.targets文件,但将TypeScriptEnabled为true,是否希望TypeScript Build选项卡从项目属性中消失?

  <!--
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />
  -->
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>
</Project>

如果是这样,这似乎很奇怪,因为这意味着在不重新启用目标然后使用UI的情况下,将无法控制UI中可访问的设置(或更实际的做法是,此时直接编辑TS项目设置,因为您仍然在那里。)

我之所以要问所有这些,是因为我几周前写了一个npm库,从.csproj和.vbproj(https://www.npmjs.com/package/csproj2ts)中读取TypeScript构建属性。目前正在整合到grunt-ts。 准备就绪后,将有一种简单的方法来有效地“针对.csproj文件运行tsc”(按此处的要求:https://github.com/Microsoft/TypeScript/issues/1702)。 我希望能够告诉人们建立项目的最佳方法,以便使用VS TypeScript语言服务来获得编码经验,但是完全使用grunt-ts进行构建。 我希望在这种情况下可以让用户使用UI配置TypeScript属性,但事实并非如此。

您是否知道在禁用TypeScript .targets文件的情况下显示“ TypeScript构建”选项卡的方法?

另外,即使我执行以下操作: <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition=" '$(Configuration)' == 'Debug' " /> ,我也必须将项目配置设置为Debug,然后重新加载才能显示TypeScript Build选项卡。

抱歉, @ mhegazy-我保证我不会

预计TypeScript Build选项卡应该从项目属性中消失吗?

是的,属性页已连接到目标中,因此删除属性页将删除UI,您将必须手动编辑文件

我之所以要问所有这些,是因为我几周前写了一个npm库,从.csproj和.vbproj(https://www.npmjs.com/package/csproj2ts)中读取TypeScript构建属性。目前正在整合到grunt-ts。

您尝试实现的方案是可行的,但是会有一些粗糙的边缘,并且您需要破解一些地方才能使其工作。 @paulvanbrenk当前在VS中添加了对tsconfig的支持,这允许项目属性页使用tsconfig文件(如果存在)。 我们还致力于更好地集成到ASP.net 5项目中,我相信它将完成您想要的所有工作,即1. grubt / bower支持,2。基于文件系统的视图,3。使用tsconfig管理项目属性,以及4.与其他编辑者/ IDE的简单交互。 我相信这将与您所描述的场景很好地配合,并且您不必费解。 这将在下一个版本中发布,因此涉及一些等待:)

另外,即使我做了这样的事情: ,我必须将项目配置设置为Debug,然后重新加载才能显示TypeScript Build选项卡。

加载项目时将加载导入。 因此,在此导入中,您是说仅在“配置”“调试”中加载,更改配置不会强制重新加载。

抱歉, @ mhegazy-我保证我不会
:D不用担心。 一直喜欢获得反馈,并希望能有所帮助。

好。 的确,感谢您提供的如此出色的信息和详尽的讨论。

只是将其扔给@paulvanbrenk-即使在将来的状态下也可以使用tsconfig来禁用VisualStudio TypeScript构建(这意味着CTRL + SHIFT + B)生成您的C#等,而不生成TypeScript),并使用外部TypeScript编译器,同时保留通过GUI设置TypeScript选项的功能。 使用外部编译工具非常有帮助的原因有很多,现在看来,这确实只是偶然的支持,并且带有一些粗糙的边缘。

tsconfig想法很棒,但实际上并没有帮助:

  • 使用旧版本的TypeScript
  • 在同一台计算机上的不同项目上使用不同版本的TypeScript
  • 使用TypeScript的实验版本(例如@fdecampredon的支持JSX的版本)
  • 使用诸如grunt-ts之类的构建工具来自动化参考管理,并执行TypeScript不支持的其他杂项
  • 等等。

允许Visual Studio用户选择社区开发的TypeScript编译器系统,同时仍将漂亮的UI保留在Visual Studio中会很棒(特别是使用漂亮的Task Runner Explorer插件)。 希望您能权衡这将为社区带来的重大好处,以及您编写“禁用TypeScript构建”复选框所花费的时间。

希望您能权衡这将为社区带来的重大好处,以及您编写“禁用TypeScript构建”复选框所花费的时间。

这是我感到困惑的部分。 对我来说,这是删除打字稿目标引用,然后将其替换为您的咕unt咕replacing的目标,这将使事情有所不同。 包含一个.targets文件的条件告诉我什么都不做对我来说很奇怪; 为什么要首先包含它? 我很乐意帮助编写一个替换标准打字稿目标的.targets文件,该文件将包含<TypeScriptEnabled>true</TypeScriptEnabled>标签,并且看起来像VS是默认文件,但它将以不同的方式处理构建。

嗯我应该考虑到这一点-我认为我一直将.targets文件视为不可更改的内容,但这当然是很合理的。 我将研究目标文件格式并与您联系。

一个简单的开始方法是复制目标文件Microsoft.TypeScript.Target,删除不需要的内容,例如调用tsc,添加任务以调用grunt,并将其连接到配置中,等等。然后将其包含在您的项目。

太棒了! 通过使用以下4行设置.csproj文件,我从最低限度的角度使所有工作正常进行。

  <Import Project="$(ProjectDir)\custom.TypeScript.targets" />
  <PropertyGroup>
    <TypeScriptEnabled>true</TypeScriptEnabled>
  </PropertyGroup>

极简的custom.TypeScript.targets文件是这样的:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <VsToolsPath Condition="'$(VsToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VsToolsPath>
  </PropertyGroup>
  <UsingTask TaskName="TypeScript.Tasks.VsTsc" AssemblyFile="$(VSToolsPath)\TypeScript\TypeScript.tasks.dll" />
  <PropertyGroup>
    <CfgPropertyPagesGuidsAddCSharp>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddCSharp>
    <CfgPropertyPagesGuidsAddVB>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddVB>
    <CfgPropertyPagesGuidsAddTypeScript>{d4683cae-88c4-4b85-863d-ac8014f3ba36}</CfgPropertyPagesGuidsAddTypeScript>
  </PropertyGroup>
  <ItemGroup>
    <ProjectCapability Include="TypeScript" />
  </ItemGroup>
</Project>

我尝试将<TypeScriptEnabled />标记放在目标文件中,但是没有用(VS将.ts文件视为松散的)。 知道为什么吗? (我确定对于知道MSBuild的人是显而易见的-也许是某种范围问题?)。

我认为这可以解决我的问题。 我可以使用Task Runner Explorer扩展程序运行Grunt任务,该扩展程序可以在触发VS构建时启动Grunt或Gulp任务。 现在,无论TypeScript编译结果如何,构建始终显示为成功,但这很好,因为用户可以在TRX窗口中看到grunt-ts的输出。 “ TypeScript Build”面板将出现在项目属性窗口中。 如果选择该选项,则在保存时进行编译即可。 如果C#或VB代码未成功编译,则构建仍显示为失败(一件好事)。 从默认的Visual Studio“带有TypeScript的HTML应用程序”或ASP.NET Web项目中获取安装程序非常简单。

您在使用grunt-ts分发上述极简.targets文件时是否看到任何问题? 那意味着我们只需要告诉人们将他们项目的.targets行更新为<Import Project="$(ProjectDir)\node_modules\grunt-ts\custom.TypeScript.targets" />并设置<TypeScriptEnabled>

再次感谢!!

我试着把标签在目标文件中,但无法正常工作(VS将.ts文件视为宽松)。 知道为什么吗? (我确定对于知道MSBuild的人是显而易见的-也许是某种范围问题?)。

这很奇怪。 这就是我们在目标中使用它的方式,并且效果很好。 您是否包括具有该属性的其他目标? 有条件吗? 我在一个新的ts项目中尝试过,删除了Microsoft.TypeScript.targets,然后放进去,然后添加了真正并且有效。

您在使用grunt-ts分发上述极简.targets文件时是否看到任何问题? 那意味着我们只需要告诉人们将他们项目的.targets行更新为并设置

我认为这是正确的方法。 我只是想在那里获得TypeScriptEnabled。 让我知道我如何可以帮助诊断问题

一些注意事项,除非不需要其他内容,否则不需要task.dll引用或VsToolsPath定义。

我在家用计算机上看到了您预测的行为。 它也无需引用DLL就可以工作。 我之前肯定已经犯了某种错误,所以明天我将再次尝试。 我认为这真的很棒! 谢谢,穆罕默德。 这应该在接下来的几天内作为grunt-ts的一部分发布。

可能导致此问题的一件事是在VS中仅将目标文件加载一次,因此,如果编辑目标,则更改将不会反映在您的项目中,直到重新启动VS。

可能就是这样; 我只是在卸载/重新加载项目。 我有可能在家里重启了VS。 我将在文档中对此进行记录。

@mhegazy感谢您的所有帮助。 我们发布了grunt-ts 4.0.0,其中包含“从Visual Studio Project编译”功能:

https://github.com/TypeStrong/grunt-ts#vs

禁用VS构建的说明:

https://github.com/TypeStrong/grunt-ts/blob/master/docs/DisableVisualStudioBuild.md

很酷! 我喜欢这样实现的方案。

谢谢,瑞安我对结果非常满意。 当tsconfig出现时,它可能没那么必要,但这将弥合差距直到那时,并且它当然与1.5之前的TypeScript编译器版本兼容。

PS:今天有两个错误报告,因此,如果我可以纠正它们,我们应该在今晚发布4.0.1。

仅供参考,在VS2015 RTM中,有一种更简单的方法来禁用TypeScriptCompile:
只需将<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>.csproj ,例如在第一个<PropertyGroup>

谢谢。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Roam-Cooper picture Roam-Cooper  ·  3评论

blendsdk picture blendsdk  ·  3评论

uber5001 picture uber5001  ·  3评论

bgrieder picture bgrieder  ·  3评论

siddjain picture siddjain  ·  3评论