鸿蒙多环境配置(一)

news/2025/3/14 6:21:45/文章来源:https://www.cnblogs.com/zhaloe/p/18507962

在实际开发过程中,你是否遇到了如下一些问题。项目分多套环境,如开发环境,生产环境,甚至还有灰度环境,不同的环境请求的服务器地址不一样,不同环境依赖的库也不一样,使用的三库key也不一样。测试会问开发环境的包和生产环境的包可以同时安装在手机上吗,我怎么区分哪个是生产环境的包,开发环境能否加个入口等等。

是否可以使用debug和release来区分不同的环境

大多数情况下,我们可能只需要区分开发环境和生产环境,那么有人会问,只有2套环境,是否可以用debug代表开发环境,release来代表生产环境呢?在代码编译阶段,会生成一个BuildProfile文件,在代码中使用BuildProfile.DEBUG就能区分了。

这种方式在部分场景下也许可行,但有存在一些问题,比如后面在上线前增加灰度环境怎么处理,遇到问题要在生产环境调试怎么办?所以我们并不推荐使用此方式来区分不同的环境,鸿蒙提供了ProductTarget概念来很好的处理多环境配置需要。

认识Product和Target

我们将需要编译打包的应用定义为一个Product,当想打多个不同应用时,就可以定义多个不同的Product,执行打包时,也需要选择相应的Product。

每一个Module都可以设定自己的源码目录,资源目录,运行的设备,分发规则等等,我们将这些行为定义成一个Target,不同的Target可以有不同的行为。每一个Target都需要配置应用到哪些Product中,这样就建立了Product与Target的关联关系。

下图是选择Product和Target的方式。

配置多环境产物

如何在手机上同时安装开发包和生产包

要想同时安装开发包和生产包,需要有2个bundleName,我们可以定义2个Product,在Product中设置不同的bundleName,示例如下

{"app": {"signingConfigs": [],"products": [{"name": "default",//开发环境"bundleName": "com.aloe.moment.dev"},{"name": "prod",//生产环境"bundleName": "com.aloe.moment"}]}
}

如何区分开发包和生产包

手机桌面上同时安装了开发包和生产包,该如何区分哪个是生产包呢,是否能对APP设置不同的名称和icon呢?答案是可以的,我们可以在不同的target中设置针对每一个ability设置不同的名称和icon,示例如下

{ "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default", "source": {"abilities": [{"name": "EntryAbility","icon":"$media:layered_image","label":"$string:EntryAbility_label","launchType": "singleton"}]}}, { "name": "prod", "source": {"abilities": [{"name": "EntryAbility","icon":"$media:layered_image","label":"$string:EntryAbility_label","launchType": "multiton"}]}}] }

其实Target还可以定制不同的资源目录,如何我们想针对不同的Product设置不同的名称和icon,完全可以定制不同的资源目录,然后将名称和icon放在不同的资源目录中。示例如下

{"apiType": "stageMode","targets": [{"name": "default","resource": {"directories": ["./src/default/resources","./src/main/resources"]}},{"name": "prod","resource": {"directories": ["./src/prod/resources","./src/main/resources"]}}]
}

不同的环境设置不同的参数

在开发过程中,我们经常会根据不同的环境来设置不同的参数,比如debug和release环境,所使用的参数有所不同,或者开发环境与生产环境使用的第三方key有所不同,这些场景都可以通过编译期间生成的BuildProfile来实现,避免直接在代码中判断不同的环境来设置不同的值 。下面以不随环境变化的COMMON_TYPE参数,区分debugrelease环境的BUILD_TYPE参数,区分开发环境和生产环境的KEY参数来举例说明

{"apiType": "stageMode","buildOption": {"arkOptions": {"buildProfileFields": {"COMMON_TYPE": "common_type"}}},"buildOptionSet": [{"name": "release","arkOptions": {"buildProfileFields": {"BUILD_TYPE": "build_release"}}},{"name": "debug","arkOptions": {"buildProfileFields": {"BUILD_TYPE": "build_debug"}}}],"targets": [{"name": "default","config": {"buildOption": {"arkOptions": {"buildProfileFields": {"KEY": "default_key"}}}}},{"name": "prod""config": {"buildOption": {"arkOptions": {"buildProfileFields": {"KEY": "prod_key"}}}}}]
}

这样配置后,编译时会自动根据不同的环境来生成不同的参数,在代码中就可以直接使用,不用额外判断环境了。

不同的环境如何区分不同的业务逻辑

现在有这样一个需求,生产环境正常显示APP的版本名称和版本号,开发环境为了区分当前提测包是否为最新包,需要额外显示一个打包时间或最新代码提交时间,这种需求除了在代码中判断环境,还能如何处理呢?测试要求在开发包中额外增加一个配置入口,方便他们直接修改相关配置,可以不判断环境,统一处理吗?

针对上面的问题,我们可以在Target中设置不同的源码目录,然后根据各自的环境,实现不同的业务逻辑。我们先在Target中配置不同的源码目录,示例如下

{"apiType": "stageMode","targets": [{"name": "default","source": {"sourceRoots": ["./src/default"]}},{"name": "prod","source": {"sourceRoots": ["./src/prod"]}}]
}

然后在各自的源码目录中实现相关逻辑,我们以实现一个AppUtil.getName获取名称和testConfig添加测试配置入口为例,相关代码如下

//开发环境的实现
export namespace AppUtil{export function getName():string{return 'develop'}
}
@Builder
export function testConfig(){Button('测试入口')
}//生产环境的实现
export namespace AppUtil{export function getName():string{return 'produce'}
}
@Builder
export function testConfig(){}

在页面中使用方式如下

import { AppUtil,testConfig } from 'entry/ets/utils/AppUtil';@Entry
@Component
struct Index {build() {Column() {Text(AppUtil.getName())testConfig()}.height('100%').width('100%')}
}

最终运行到手机上的效果是开发环境界面显示develop并在下方显示了一个测试入口的按钮,而在生产环境仅显示了produce,没有显示测试入口的按钮。

  • 完整示例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/822674.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Linux上设置文件共享(如Samba)

​在Linux上设置文件共享涉及以下步骤:1.安装Samba软件包;2.配置Samba设置;3.创建共享文件夹和用户权限;4.启动和管理Samba服务;5.从其他设备访问共享文件。在启动文件共享之前,您应该首先选择合适的文件共享工具。1.安装Samba软件包 开始之前,确保您的系统软件包已更新…

前端构建工具有哪些

前端构建工具的选择:WEBPACK、GULP、GRUNT、PARCEL、ROLLUP 前端构建工具是前端开发过程中不可或缺的部分,主要包括WEBPACK、GULP、GRUNT、PARCEL、ROLLUP。WEBPACK 是最受欢迎的模块打包工具,它能够处理项目的各种资源,例如JavaScript、CSS、图片等,并支持各种加载器和插…

PBOOTCMS后台出现“登入失败:表单提交校验失败,刷新后重试!”等情况怎么办?

PBOOTCMS后台出现“登入失败:表单提交校验失败,刷新后重试!”等情况怎么办?解决方法:切换PHP版本试试。如果刷新无果,在根目录下找到 runtime 文件夹,将其删除,然后刷新页面重试。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQ…

使用HTTP头进行403绕过 速率绕过 Rate Limit Bypass

原理 某些服务可能根据HTTP头部的信息(如User-Agent、X-Forwarded-For等)来识别用户。如果服务器未正确验证这些头部,攻击者可通过伪造这些头部来绕过限制。使用HTTP头进行403绕过 速率绕过 Rate Limit Bypass HTTP Headers列表 CACHE_INFO: 127.0.0.1 CF_CONNECTING_IP: 12…

在线项目管理工具哪个好

分享7款不错的在线项目管理工具软件:1.PingCode;2.Worktile;3.Trello;4.Asana;5.Monday.com;6.Wrike;7.Basecamp。在线项目管理工具适应了移动和远程工作的趋势,确保无论身处何地,团队都能实时同步和协作。使用这些工具可以节省成本和时间,让团队更专注于核心任务。 …

什么是监督学习和非监督学习

监督学习和非监督学习是机器学习领域的两种核心方法。监督学习以有标签的数据为基础,用于分类和回归任务,而非监督学习则处理未标签的数据,通常用于聚类和降维。监督学习是一种机器学习方法,其中算法通过训练数据集中的标签来学习模式。非监督学习是一种机器学习方法,其中…

如何进行图片懒加载

​进行图片懒加载需要遵循以下步骤:一、了解懒加载的基础;二、选择合适的技术实现;三、确保向后兼容;四、优化用户体验;五、持续测试和评估。懒加载的首要任务是减少不必要的网络请求,提高页面加载速度。一、了解懒加载的基础 在实施懒加载之前,我们需要了解其基本概念和…

如何搭建一套完整的数据指标体系

### 如何搭建一套完整的数据指标体系 在构建一套完整的数据指标体系时,关键在于理解业务目标、确定关键绩效指标(KPI)、确保数据质量和可访问性、以及建立定期审查机制。首先,要深入理解业务目标,这是构建指标体系的基础。接着,根据业务目标确定能够反映业务进展和成果的关…

opencv和ffmpeg是什么关系

OpenCV和FFmpeg之间的关系主要体现在视频处理和编解码的应用场景中。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,主要用于图像和视频处理。FFmpeg是一个用于处理多媒体数据(如音频、视频、字幕等)的开源软件项目。两者可以结合使用,其中FFmpe…

Windows11 C盘扩容

https://www.pcoic.com/system/windows/218.htmlWindows 系统内置了一个强大的工具——磁盘管理,下文我将模拟日常需求,分别演示新建、合并分区,以及分配和修改盘符的操作。 一、新建分区 这是电脑用户最主要的需求。前两三年 SSD 的价格还比较高,高端电脑普遍采取 SSD+HDD…

IT项目经理应如何管理项目

在管理一个IT项目时,一个项目经理应当采取以下关键步骤:制定详细的项目计划、确保沟通流畅、持续监控项目进度、管理项目风险、保持团队动力以及确保项目质量。其中,制定详细的项目计划是项目成功的基石。项目计划包括了定义项目的范围、确定任务和里程碑、资源分配、时间估…