リビルド時にこのようなエラーが出ることがあります。
System.InvalidOperationException: No file exists for the asset at either location 'wwwroot\bundles\generals.js' or 'wwwroot\bundles\generals.js'. 場所 Microsoft.AspNetCore.StaticWebAssets.Tasks.StaticWebAsset.ComputeFingerprintAndIntegrity(String identity, String originalItemSpec) 場所 Microsoft.AspNetCore.StaticWebAssets.Tasks.DefineStaticWebAssets.Execute()
■ 普通は出ない
リポジトリからクローンしてきてリビルドしてもエラーは起きません。
ではいつ起きるか。global.json を消したときです。中身は
{ "sdk": { "version": "8.0.404", "rollForward": "latestPatch" } }
■ なぜ消したか
これは .NET 8 を強制するもので、.NET 8 のインストールされていない環境でビルドできなかったからです。
今手元のマシンが .NET 9 と 10 しか入っていなくて面倒だなと思って。
※ global.json を消せばより上位の .NET 9 や 10 でビルドができるようになります。
■ 発生タイミング
クリーンではエラーは起きません。
ビルドではエラーは起きません。
Visual Studio でのリビルドでエラーになります。
■ おそらく
BundlerMinifier が Minifier するとき少し時間がかかって、どうにかなってエラーになるのでしょう。
■ 結論
クリーン後にスリープを入れたらエラーは出なくなりました。 .csproj に書き加え
<Target Name="AfterCleanSleep" AfterTargets="Clean"> <Exec Command="powershell -Command "Start-Sleep -Seconds 5"" Condition="'$(OS)'=='Windows_NT'"/> </Target>
入れる場所が明確になるように、ファイルの最後まで書くと
<Target Name="AfterCleanSleep" AfterTargets="Clean"> <Exec Command="powershell -Command "Start-Sleep -Seconds 5"" Condition="'$(OS)'=='Windows_NT'"/> </Target> </Project>
ちなみに、Pleasanter は 2 スペースインデントなので注意してください。うっかり ctrl+k, ctrl+d など押すと全行差分になります。
■ ちなみに
5 秒でなく 4 秒でもうまくいきましたが、環境差を考えて 1 秒長く書きました。
Linux でどうなるか試していないので Windows だけで Sleep するようにしてみました。
PowerShell で Sleep しています。DOS コマンド書いてもうまくいかなかったので。
ビルド前でなく、クリーン後のタイミングにしたのは、クリーンの方が行う回数が少ないと思ったからです。ビルドは結構頻繁にすると思うので。
■ コード
コードはこちら