如何防止 visual studio 2017 构建 javascript?

How to prevent visual studio 2017 from build javascript?

我今天升级到 VS2017,每次我在我的 Web 应用程序项目中更改某些内容时,我都会看到 - 构建再次构建我的所有 javascript(我正在为客户端使用 webpack)。 这很酷,但需要花费很多时间,所以我很乐意将其配置为停止构建 javascript(我会在它发生变化时自己构建它)。

简单回答

在您的 csproj 文件中,将以下行添加到现有的 PropertyGroup 块中:

<PropertyGroup>
     <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
</PropertyGroup>

如果将 .ts.tsx 文件添加到您的项目导致您的项目文件被修改,您可能需要应用以下修复。有关详细信息,请参阅 bug report

 <ItemGroup>
      <None Remove="**/*.ts;**/*.tsx" />
      <Content Remove="**/*.ts;**/*.tsx" />
      <TypeScriptCompile Include="**/*.ts;**/*.tsx" />
 </ItemGroup>

tsconfig.json 文件添加到项目根目录并确保设置了以下设置:

"compileOnSave": false,

最后,重启Visual Studio


详情

Nuget 在项目的 obj 目录中创建一个名为 [ProjectName].csproj.nuget.g.targets 的生成目标文件。此目标文件正在导入 Microsoft.NET.Sdk.Web.ProjectSystem.targets,后者又会导入 Microsoft.TypeScript.targets.

Microsoft.TypeScript.targets文件中,下面一行有一个注释,让我们知道如果这个属性设置为true,那么TypeScript编译任务将什么都不做:

<!-- Makes the TypeScript compilation task a no-op -->
<TypeScriptCompileBlocked Condition="'$(TypeScriptCompileBlocked)' == ''">false</TypeScriptCompileBlocked>

我正在使用 webpack 的 ts-loader 来编译和捆绑我的 TypeScript 文件。所以我不再需要 Visual Studio 在每次构建时执行的自动编译。在 Visual Studio 2017 年,我只是注释掉 tsconfig.json 中的以下行以停止自动编译:

"outDir": "./wwwroot/build/",

我遇到了同样的问题 - Webpack 每次 Visual Studio 重建项目时都会重建我的 Typescript 文件,尽管有

<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>

在我的项目文件中,并且

"compileOnSave": false,
  "buildOnSave": false

在我的 tsconfig.json 文件中。

原来是因为我安装了 NPM Task Runner VS 扩展 (https://marketplace.visualstudio.com/items?itemName=MadsKristensen.NPMTaskRunner),并且在 Task Runner Explorer 中,它有一个绑定到 'Before Build' 事件的构建任务。我不需要这个扩展,所以我把它卸载了。

注意:我不需要 Webpack 在 VS 构建上重建,因为我让它监视我的文件并在我进行更改时重建,通过此扩展:https://marketplace.visualstudio.com/items?itemName=MadsKristensen.WebPackTaskRunner

TypeScriptCompileBlocked 设置为 true 对我来说还不够。有用的是项目属性 - 有一个 TypeScript Build 选项卡,您可以在其中配置 TS 编译,包括 Compile On Save 选项:

它导致以下内容被添加到 csproj 文件中:

<TypeScriptTarget>ES5</TypeScriptTarget>
<TypeScriptJSXEmit>None</TypeScriptJSXEmit>
<TypeScriptModuleKind>ES6</TypeScriptModuleKind>
<TypeScriptCompileOnSaveEnabled>False</TypeScriptCompileOnSaveEnabled>
<TypeScriptNoImplicitAny>False</TypeScriptNoImplicitAny>
<TypeScriptRemoveComments>False</TypeScriptRemoveComments>
<TypeScriptOutFile />
<TypeScriptOutDir />
<TypeScriptGeneratesDeclarations>False</TypeScriptGeneratesDeclarations>
<TypeScriptNoEmitOnError>True</TypeScriptNoEmitOnError>
<TypeScriptSourceMap>True</TypeScriptSourceMap>
<TypeScriptMapRoot />
<TypeScriptSourceRoot />

完成以下设置并将 TypeScriptCompileBlocked 设置为 true。

在应用程序的 .csproj 文件中将以下条件设置为 false。

抱怨 .ts 文件的错误: 当我尝试重建包含一些打字稿文件的 VS2017 Web 项目时出现构建错误。错误看起来像这些 Error TS1005 (TS) '?' expected. C:\...\...project1 (tsconfig or jsconfig project) C:\...\...project1 \node_modules\@storybook\addon-knobs\dist\type-defs.d.ts

没有真正有用的答案..到目前为止: 在花了几个小时在 Stack 上下搜索之后,我意识到将错误的项目文件与另一个也有打字稿但没有编译错误的项目文件进行比较一样简单。

这很简单..但是很有效:

步骤如下:

  1. 卸载项目并编辑项目文件

  2. 搜索“TypeScript”(精确大小写和精确单词选项)并找到两个匹配的导入:

    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props')" />

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

  1. 然后我去编译.ts文件没问题的Project看,Condition不一样:

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

  2. 所以我只是用 3) 中的一个替换了 Import 并重新加载项目,正如预期的那样,编译成功。

在完美世界中,Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets ')" 可能与 Condition="false" 完全相同,但没有,即使在我的机器中也不存在这样的文件夹 (C:\Program Files (x86)\MSBuild.0).

有时候,常识比深厚的知识更有帮助,这就是那个时候。

就我而言 (Visual Studio 2017 15.9.25),我必须将以下 属性 添加到 .csproj

<PropertyGroup>
   <TypeScriptCompileOnSaveEnabled>false</TypeScriptCompileOnSaveEnabled>
</PropertyGroup>

更多详情:

看了这篇文章https://www.typescriptlang.org/docs/handbook/compiler-options-in-msbuild.html,了解到VS会根据文件Microsoft.TypeScript.targets.

构建TS

而在这个文件中,我看到它也是基于这个属性来控制Compile-on-Save TypeScriptCompileOnSaveEnabled。所以在 .csproj 中将这个 属性 设置为 false 将在保存时停止编译打字稿。 (请注意,在这样做之前我已经尝试在 tsconfig.json 文件中设置 "compileOnSave": false 但它没有帮助)