鸿蒙多环境配置(一)

打印 上一主题 下一主题

主题 771|帖子 771|积分 2313

在实际开发过程中,你是否碰到了如下一些问题。项目分多套环境,如开发环境,生产环境,甚至另有灰度环境,差别的环境哀求的服务器所在不一样,差别环境依靠的库也不一样,使用的三库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的方式。

配置多环境产物

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

要想同时安装开发包和生产包,需要有2个bundleName,我们可以界说2个Product,在Product中设置差别的bundleName,示例如下
  1. {
  2.   "app": {
  3.     "signingConfigs": [],
  4.     "products": [
  5.       {
  6.         "name": "default",//开发环境
  7.         "bundleName": "com.aloe.moment.dev"
  8.       },
  9.       {
  10.         "name": "prod",//生产环境
  11.         "bundleName": "com.aloe.moment"
  12.       }
  13.     ]
  14.   }
  15. }
复制代码
如何区分开发包和生产包

手机桌面上同时安装了开发包和生产包,该如何区分哪个是生产包呢,是否能对APP设置差别的名称和icon呢?答案是可以的,我们可以在差别的target中设置针对每一个ability设置差别的名称和icon,示例如下
  1. {
  2.    "apiType": 'stageMode',
  3.    "buildOption": {
  4.    },
  5.    "targets": [
  6.      {
  7.        "name": "default",
  8.        "source": {
  9.         "abilities": [
  10.           {
  11.             "name": "EntryAbility",
  12.             "icon":"$media:layered_image",
  13.             "label":"$string:EntryAbility_label",
  14.             "launchType": "singleton"
  15.           }
  16.         ]
  17.       }
  18.      },
  19.      {
  20.        "name": "prod",
  21.        "source": {
  22.         "abilities": [
  23.           {
  24.             "name": "EntryAbility",
  25.             "icon":"$media:layered_image",
  26.             "label":"$string:EntryAbility_label",
  27.             "launchType": "multiton"
  28.           }
  29.         ]
  30.       }
  31.      }
  32.    ]
  33. }
复制代码
其实Target还可以定制差别的资源目次,如何我们想针对差别的Product设置差别的名称和icon,完全可以定制差别的资源目次,然后将名称和icon放在差别的资源目次中。示例如下
  1. {
  2.   "apiType": "stageMode",
  3.   "targets": [
  4.     {
  5.       "name": "default",
  6.       "resource": {
  7.         "directories": [
  8.           "./src/default/resources",
  9.           "./src/main/resources"
  10.         ]
  11.       }
  12.     },
  13.     {
  14.       "name": "prod",
  15.       "resource": {
  16.         "directories": [
  17.           "./src/prod/resources",
  18.           "./src/main/resources"
  19.         ]
  20.       }
  21.     }
  22.   ]
  23. }
复制代码
差别的环境设置差别的参数

在开发过程中,我们常常会根据差别的环境来设置差别的参数,比如debug和release环境,所使用的参数有所差别,或者开发环境与生产环境使用的第三方key有所差别,这些场景都可以通过编译期间生成的BuildProfile来实现,制止直接在代码中判定差别的环境来设置差别的值 。下面以不随环境变化的COMMON_TYPE参数,区分debug和release环境的BUILD_TYPE参数,区分开发环境和生产环境的KEY参数来举例阐明
  1. {
  2.   "apiType": "stageMode",
  3.   "buildOption": {
  4.     "arkOptions": {
  5.       "buildProfileFields": {
  6.         "COMMON_TYPE": "common_type"
  7.       }
  8.     }
  9.   },
  10.   "buildOptionSet": [
  11.     {
  12.       "name": "release",
  13.       "arkOptions": {
  14.         "buildProfileFields": {
  15.           "BUILD_TYPE": "build_release"
  16.         }
  17.       }
  18.     },
  19.     {
  20.       "name": "debug",
  21.       "arkOptions": {
  22.         "buildProfileFields": {
  23.           "BUILD_TYPE": "build_debug"
  24.         }
  25.       }
  26.     }
  27.   ],
  28.   "targets": [
  29.     {
  30.       "name": "default",
  31.       "config": {
  32.         "buildOption": {
  33.           "arkOptions": {
  34.             "buildProfileFields": {
  35.               "KEY": "default_key"
  36.             }
  37.           }
  38.         }
  39.       }
  40.     },
  41.     {
  42.       "name": "prod"
  43.       "config": {
  44.         "buildOption": {
  45.           "arkOptions": {
  46.             "buildProfileFields": {
  47.               "KEY": "prod_key"
  48.             }
  49.           }
  50.         }
  51.       }
  52.     }
  53.   ]
  54. }
复制代码
这样配置后,编译时会自动根据差别的环境来生成差别的参数,在代码中就可以直接使用,不消额外判定环境了。
差别的环境如何区分差别的业务逻辑

现在有这样一个需求,生产环境正常表现APP的版本名称和版本号,开发环境为了区分当前提测包是否为最新包,需要额外表现一个打包时间或最新代码提交时间,这种需求除了在代码中判定环境,还能如那边理呢?测试要求在开发包中额外增加一个配置入口,方便他们直接修改相关配置,可以不判定环境,统一处理吗?
针对上面的问题,我们可以在Target中设置差别的源码目次,然后根据各自的环境,实现差别的业务逻辑。我们先在Target中配置差别的源码目次,示例如下
  1. {
  2.   "apiType": "stageMode",
  3.   "targets": [
  4.     {
  5.       "name": "default",
  6.       "source": {
  7.         "sourceRoots": ["./src/default"]
  8.       }
  9.     },
  10.     {
  11.       "name": "prod",
  12.       "source": {
  13.         "sourceRoots": ["./src/prod"]
  14.       }
  15.     }
  16.   ]
  17. }
复制代码
然后在各自的源码目次中实现相关逻辑,我们以实现一个AppUtil.getName获取名称和testConfig添加测试配置入口为例,相关代码如下
  1. //开发环境的实现
  2. export namespace AppUtil{
  3.   export function getName():string{
  4.     return 'develop'
  5.   }
  6. }
  7. @Builder
  8. export function testConfig(){
  9.   Button('测试入口')
  10. }
  11. //生产环境的实现
  12. export namespace AppUtil{
  13.   export function getName():string{
  14.     return 'produce'
  15.   }
  16. }
  17. @Builder
  18. export function testConfig(){}
复制代码
在页面中使用方式如下
  1. import { AppUtil,testConfig } from 'entry/ets/utils/AppUtil';
  2. @Entry
  3. @Component
  4. struct Index {
  5.   build() {
  6.     Column() {
  7.       Text(AppUtil.getName())
  8.       testConfig()
  9.     }
  10.     .height('100%')
  11.     .width('100%')
  12.   }
  13. }
复制代码
最终运行到手机上的结果是开发环田地面表现develop并在下方表现了一个测试入口的按钮,而在生产环境仅表现了produce,没有表现测试入口的按钮。


  • 完整示例代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表