如何让Visual Studio或Costura自动移除deps.json中的嵌入程序集条目?
解决Costura.Fody嵌入程序集后
.deps.json残留条目导致的运行错误 我之前也碰到过完全一样的问题!当用Costura把依赖的.NET Standard程序集嵌入到.NET Core控制台应用后,MyApp.deps.json里依然保留着这些嵌入程序集的引用条目,导致运行时CLR会尝试去磁盘查找它们,直接抛出找不到文件的错误。手动删条目虽然能解决,但每次构建都要弄一遍太麻烦了,下面有两种内置的自动处理方法:
方法1:开启Costura自带的CleanupDepsJson功能
其实Costura本身就提供了清理.deps.json的能力,只是默认没启用。你只需要修改FodyWeavers.xml,给Costura节点加上CleanupDepsJson="true"属性就行,修改后的配置如下:
<?xml version="1.0" encoding="utf-8"?> <Weavers> <Costura IncludeDebugSymbols="false" CleanupDepsJson="true"> <IncludeAssemblies> My.Assembly </IncludeAssemblies> </Costura> </Weavers>
之后每次构建项目时,Costura会自动扫描.deps.json,把对应已嵌入程序集的条目全部移除,完全不用手动干预。
方法2:用MSBuild任务兜底(如果方法1不生效)
要是上面的配置没起作用(比如用了较旧版本的Costura),可以在你的项目文件(.csproj)里添加一个自定义MSBuild目标,在构建完成后自动清理.deps.json。把这段代码加到项目文件中:
<Target Name="CleanupDepsJsonAfterBuild" AfterTargets="Build"> <ItemGroup> <DepsJsonFile Include="$(OutputPath)$(AssemblyName).deps.json" /> </ItemGroup> <Exec Command="powershell -Command "$content = Get-Content '%(DepsJsonFile.FullPath)' -Raw; $content = $content -replace '\s*"My\.Assembly": {[^}]+},?', ''; Set-Content '%(DepsJsonFile.FullPath)' -Value $content -Encoding utf8"" /> </Target>
这个任务会在构建完成后,调用PowerShell脚本把.deps.json里关于My.Assembly的条目删掉。记得把正则里的My\.Assembly替换成你实际的程序集名称(.在正则里要转义)。
小提醒:检查Costura版本
如果你用的是旧版Costura,可能没有CleanupDepsJson这个选项。建议打开NuGet包管理器,把Costura.Fody更新到最新版本,这个功能是在后续版本中新增的,优先用方法1会更省心。
内容的提问来源于stack exchange,提问作者Broots Waymb
相关产品推荐
相关产品推荐

