Ios 如何更新UWP appxupload软件包,而无需重建以适应多个环境
我们正在构建一个针对iOS和UWP的Xamarin.Forms应用程序。我们有一个要求,即该应用程序应作为单独的安装程序提供,以用于暂存和生产。基本上,每个环境都有自己的设置(服务器URL、应用程序配置等),这些设置存储在外部Ios 如何更新UWP appxupload软件包,而无需重建以适应多个环境,ios,xamarin.forms,uwp,devops,Ios,Xamarin.forms,Uwp,Devops,我们正在构建一个针对iOS和UWP的Xamarin.Forms应用程序。我们有一个要求,即该应用程序应作为单独的安装程序提供,以用于暂存和生产。基本上,每个环境都有自己的设置(服务器URL、应用程序配置等),这些设置存储在外部Configuration.json文件中。要点是,为了为每个环境动态选择正确的Configuration.json文件,不应重新构建应用程序。我们应该只构建一次应用程序,并且只更改配置。我们能够为iOS解决这个问题 为了支持iOS的动态配置,我们做了以下工作 在项目中存储
Configuration.json
文件中。要点是,为了为每个环境动态选择正确的Configuration.json
文件,不应重新构建应用程序。我们应该只构建一次应用程序,并且只更改配置。我们能够为iOS解决这个问题
为了支持iOS的动态配置,我们做了以下工作
StagingConfiguration.json
,ProductionConfiguration.json
com.mycompany.app.staging
,对于生产,com.mycompany.app
ipa
文件后,我们使用fastlane
使用新的bundle id和配置文件退出应用程序,如下所示(我们使用Azure DevOps CI/CD管道进行构建和发布,此步骤是在发布管道中执行命令行,并引用环境变量来完成其工作)QQPad.Mobile.UWP_0.39.0.0_x86_x64_arm_bundle.appxupload
。我们可能需要执行以下操作之一来支持我们的场景
- 执行与在iOS中相同的操作-在应用商店中创建单独的UWP应用程序,在项目中存储多个配置文件,在
项目准备就绪后更改应用程序的包名,并在代码端检测包ID并选择正确的配置文件appxupload
- 或者,如果可能的话,更好的解决方案是
- 不要创建单独的应用程序,因为管理起来很麻烦,而是在同一个应用程序宿主中创建单独的包航班
- 不要更改包名,而是能够在
中找到配置文件,并将其替换为我们选择的配置文件appxupload
- 重新打包应用程序并放弃它
- 将其上载到正确的包裹航班
同样,主要的一点是能够在不重建应用程序的情况下动态选择或更改配置。是否有任何UWP实用程序等同于iOS的fastlane,也允许对应用程序包进行操作?或者我必须手动执行此操作?如果是,具体操作方法是什么?我已经设法解决了此问题经历了很多考验和失败 我已经发布了进行必要转换的脚本 以下是总结基本策略的步骤
appxupload
path、签名证书和密码appxupload
archive。为此,我们需要使用*.zip
扩展名复制appxupload
文件,以便它成为扩展存档
powershell实用程序的有效输入appxbundle
。对于这一个和appx
包,还有一个很好的打包/解包实用程序。首先,我们使用这个工具解包appxbundle
appx
包文件。我们必须解包其中的每一个文件,并对AppxManifest.xml
文件进行必要的更改AppxManifest.xml
文件作为xml
对象打开,我们找到PackageName
属性,并将其替换为类似于登台环境的CURRENT\u PACKAGE\u NAME-STAGING
appx
包appx
包重新打包后,我们可以使用MakeAppx
实用程序打包appxbundle
。我们还必须对这一个进行签名Compress archive
重新创建appxupload
存档。这种类型的捆绑包不需要签名appxupload
推送到UWP商店var name = Windows.ApplicationModel.Package.Current.DisplayName;
string[] parts = name.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 1) return "Production";
string environmentName = parts.Last().Trim().ToLower();
我假设如果环境说明符不在“-”后面,那么它就是产品
其余的配置已经由您决定。我个人使用了Microsoft.Extensions.configuration
和appsettings.json
文件作为EmbeddedResources
var configs = new ConfigurationBuilder();
var fileProvider = new EmbeddedFileProvider(typeof(Bootstrapper).Assembly, typeof(Startup).Namespace);
configs.AddJsonFile(fileProvider, "appsettings.json", false, false)
.AddJsonFile(fileProvider, $"appsettings.{environmentName.ToLower()}.json", true, false);
更新
不幸的是,我不得不放弃这个想法……为什么我认为它在第一时间起作用,是因为我只执行了脚本并将其上传到临时飞行。之后,我们的CI管道,在QA完成测试后,尝试将原始未修改的appxupload
文件上传到生产Alpha测试飞行,这就是原因出现了问题,我收到了像这样的错误
InvalidParameterValue: Appxbundles (including previously published and currently uploaded) must be uniquely identified by their full names. You have provided two packages with the full name ****_0.55.3.0_X86_ which have different contents. Please remove one of these packages, or increment current package versions to continue.
门户似乎不能接受相同的包,具有相同的标识名和版本号
我想我还可以更新appx文件名并将STAGING附加到
InvalidParameterValue: Appxbundles (including previously published and currently uploaded) must be uniquely identified by their full names. You have provided two packages with the full name ****_0.55.3.0_X86_ which have different contents. Please remove one of these packages, or increment current package versions to continue.