鸿蒙多环境配置(一)
在实际开发过程中,你是否碰到了如下一些问题。项目分多套环境,如开发环境,生产环境,甚至另有灰度环境,差别的环境哀求的服务器所在不一样,差别环境依靠的库也不一样,使用的三库key也不一样。测试会问开发环境的包和生产环境的包可以同时安装在手机上吗,我怎么区分哪个是生产环境的包,开发环境能否加个入口等等。是否可以使用debug和release来区分差别的环境
大多数情况下,我们大概只需要区分开发环境和生产环境,那么有人会问,只有2套环境,是否可以用debug代表开发环境,release来代表生产环境呢?在代码编译阶段,会生成一个BuildProfile文件,在代码中使用BuildProfile.DEBUG就能区分了。
这种方式在部门场景下也许可行,但有存在一些问题,比如后面在上线前增加灰度环境怎么处理,碰到问题要在生产环境调试怎么办?所以我们并不推荐使用此方式来区分差别的环境,鸿蒙提供了Product和Target概念来很好的处理多环境配置需要。
熟悉Product和Target
我们将需要编译打包的应用界说为一个Product,当想打多个差别应用时,就可以界说多个差别的Product,实验打包时,也需要选择相应的Product。
每一个Module都可以设定自己的源码目次,资源目次,运行的设备,分发规则等等,我们将这些行为界说成一个Target,差别的Target可以有差别的行为。每一个Target都需要配置应用到哪些Product中,这样就创建了Product与Target的关联关系。
下图是选择Product和Target的方式。
https://img-blog.csdnimg.cn/img_convert/ff32f237acd750467880eb958dfaa1b7.png
配置多环境产物
如何在手机上同时安装开发包和生产包
要想同时安装开发包和生产包,需要有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参数,区分debug和release环境的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,没有表现测试入口的按钮。
[*]完整示例代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]