我今天升级到 VS2017,每次我在我的 web 应用程序项目中更改某些内容时,我都会看到 - 构建再次构建了我所有的 javascript(我正在使用 webpack 作为客户端)。这很酷,但需要很多时间,所以我很乐意将它配置为停止构建 javascript(我会在它发生变化时自己构建它)。
7 回答
简单的答案
在您的 csproj 文件中,将以下行添加到现有的 PropertyGroup 块:
<PropertyGroup>
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
</PropertyGroup>
如果向您的项目添加.ts
或.tsx
文件导致您的项目文件被修改,您可能需要应用以下修复。有关更多详细信息,请参阅错误报告。
<ItemGroup>
<None Remove="**/*.ts;**/*.tsx" />
<Content Remove="**/*.ts;**/*.tsx" />
<TypeScriptCompile Include="**/*.ts;**/*.tsx" />
</ItemGroup>
将tsconfig.json
文件添加到项目根目录并确保设置了以下设置:
"compileOnSave": false,
最后,重启 Visual Studio
细节
Nuget[ProjectName].csproj.nuget.g.targets
在obj
项目目录中创建一个生成的目标文件。该目标文件正在导入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/",
设置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 />
我遇到了同样的问题 - 每次 Visual Studio 重建项目时,Webpack 都会重建我的 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 中,这有一个绑定到“构建前”的构建任务' 事件。我不需要这个扩展,所以我把它卸载了。
注意:我不需要 Webpack 在 VS 构建上进行重建,因为我让它通过这个扩展来监视我的文件并在我进行更改时重建:https ://marketplace.visualstudio.com/items?itemName=MadsKristensen.WebPackTaskRunner
就我而言(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
。因此,将此属性设置为false
.csproj 将在保存时停止编译打字稿。(请注意,在执行此操作之前,我已经尝试"compileOnSave": false
在 tsconfig.json 文件中进行设置,但没有帮助)
抱怨 .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
没有真正有帮助的答案..到目前为止: 在花了几个小时在堆栈上上下搜索之后,我意识到将错误的项目文件与另一个也有打字稿但没有编译错误的项目文件进行比较可能很简单。
这很简单..但它有效:
以下是步骤:
卸载项目和编辑的项目文件
搜索“TypeScript”(精确大小写和精确单词选项)并找到两个匹配的 Imports:
<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')" />
然后我去了编译.ts文件没有问题的项目,看看,它的条件不同:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="false" />
所以我只是用 3) 中的一个替换了 Import 并重新加载了项目并按预期成功编译。
在完美的世界中,Condition="Exists ('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" 可能与Condition="false"完全相同,但有不,即使在我的机器中也不存在这样的文件夹(C:\Program Files (x86)\MSBuild\15.0)。
有时,常识比深厚的知识更有帮助,而这是那个时候。
完成以下设置以及 TypeScriptCompileBlocked 为 true。
在应用程序的 .csproj 文件中将以下条件设置为 false。