在Razor类库项目中添加TypeScript文件后出现交替构建失败的问题求助
在Razor类库项目中添加TypeScript文件后出现交替构建失败的问题求助
看起来你遇到了一个挺棘手的交替构建失败问题,我来帮你分析下可能的原因和解决办法:
问题原因分析
这个交替失败的情况,本质是MSBuild的静态Web资产任务(StaticWebAssets)和TypeScript编译任务的执行时机不匹配导致的:
- 第一次Rebuild时,TypeScript先完成编译,生成了
wwwroot/js/file1.js,StaticWebAssets任务能正常找到这个文件,构建成功; - 第二次Rebuild时,Rebuild的清理步骤会先删掉所有生成文件,但StaticWebAssets任务在TypeScript重新编译生成文件之前就去查找目标js文件,自然找不到就报错;
- 第三次Rebuild时,TypeScript编译又抢在了StaticWebAssets之前完成,所以又能成功,如此循环就形成了交替失败的现象。
具体解决办法
这里给你几个可行的修复方案,你可以根据自己的项目需求选择:
1. 强制TypeScript编译在StaticWebAssets之前执行
直接在你的test1.csproj文件里添加一个自定义目标,确保StaticWebAssets任务必须等TypeScript编译完成后再启动:
<Target Name="EnsureTypeScriptCompiledBeforeStaticWebAssets" BeforeTargets="DefineStaticWebAssets"> <MSBuild Projects="$(MSBuildProjectFile)" Targets="TypeScriptCompile" /> </Target>
这个方案最直接,不需要改动现有输出目录,只需要调整任务顺序就能解决问题。
2. 调整TypeScript输出目录,通过复制任务同步到wwwroot
把TypeScript的输出目录从wwwroot/js改成项目内的其他目录(比如dist/js),再通过MSBuild任务把编译后的文件复制到wwwroot,避开StaticWebAssets的直接依赖:
- 首先修改
tsconfig.json的outDir配置:{ "compilerOptions": { "target": "ES6", "module": "ES6", "outDir": "./dist/js", "strict": true }, "include": [ "*.ts" ] } - 然后在
test1.csproj里添加复制任务:<Target Name="CopyTypeScriptOutputToWwwroot" AfterTargets="TypeScriptCompile"> <Copy SourceFiles="$(ProjectDir)dist/js/**/*.js" DestinationFolder="$(ProjectDir)wwwroot/js" /> </Target>
3. 禁用StaticWebAssets功能(如果项目不需要)
如果你的Razor类库不需要对外提供静态Web资产,直接在test1.csproj里禁用这个任务即可:
<PropertyGroup> <EnableStaticWebAssets>false</EnableStaticWebAssets> </PropertyGroup>
关于复现问题
这个问题在你使用的VS 17.14.13 + TypeScript MSBuild 5.9.2的组合下是可以复现的,属于工具链任务顺序的兼容性问题,并不是你配置出错了哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

