Xamarin.Forms项目Azure DevOps构建后ipa和apk包丢失appsettings.json问题
Xamarin.Forms appsettings.json 打包缺失问题排查点
1. 资源类型与预期访问逻辑不匹配
- 如果你希望
appsettings.json作为独立物理文件出现在apk/ipa的文件目录中直接读取,将其设置为Embedded Resource属于错误配置Embedded Resource的作用是把文件编译嵌入到共享项目生成的.dll程序集的资源清单中,不会作为独立文件输出到应用包的文件系统- 若要读取嵌入式资源,需通过程序集接口读取,示例代码:
// 替换为共享项目中任意存在的类,用于获取对应程序集 var assembly = typeof(App).Assembly; // 资源名称默认规则:共享项目默认命名空间.文件路径.文件名,大小写敏感 using var stream = assembly.GetManifestResourceStream("YourAppNamespace.appsettings.json"); using var reader = new StreamReader(stream); string jsonContent = reader.ReadToEnd();
2. 构建环境大小写校验规则差异
- Windows本地文件系统大小写不敏感,资源名称大小写写错也能正常读取,但Azure DevOps的macOS/Linux构建代理对大小写严格校验
- 可以本地调试时输出所有资源名确认准确的资源命名:
var assembly = typeof(App).Assembly; string[] allResourceNames = assembly.GetManifestResourceNames(); // 输出allResourceNames数组内容,找到appsettings.json对应的准确资源名
- 可以本地调试时输出所有资源名确认准确的资源命名:
3. 项目构建配置异常
- 检查共享项目的.csproj文件,确认文件配置没有被条件规则排除:
<ItemGroup> <EmbeddedResource Include="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </EmbeddedResource> </ItemGroup> - 检查Azure DevOps构建的详细日志,搜索
appsettings.json关键词,确认文件没有被生成流程跳过 - 如果文件放在共享项目的子目录下,资源名称需要拼接子目录名称,比如放在Config文件夹下的资源名为
YourAppNamespace.Config.appsettings.json
4. 独立文件打包方案
如果你确实需要appsettings.json作为独立文件出现在应用包内,需要按平台分别配置:
- Android端:将文件放到Android项目的
Assets目录下,设置属性为AndroidAsset+Copy if newer,通过Assets.Open("appsettings.json")读取 - iOS端:将文件放到iOS项目的根目录下,设置属性为
BundleResource+Copy if newer,通过NSBundle.MainBundle.PathForResource("appsettings", "json")获取路径读取
内容的提问来源于stack exchange,提问作者David Shochet
相关产品推荐
相关产品推荐

