☰
uni-app x 项目从零搭建:基于 HBuilderX 的环境与发布实战
2026/10/13 18:08:33 网站建设 项目流程

uni-app x 这块新东西,我断断续续研究了一小段时间。上一篇文章把概念和差异化做了整体梳理,这篇直接动手,把一整个工程项目从零到一搭起来。文章会覆盖开发环境准备、项目初始化、目录结构、核心配置、调试运行、写页面、踩坑记录,最后聊一下打包发布前该检查什么。

目标很明确,让看完这篇的人能自己复现出一个可运行、结构清晰、后续能继续扩展的 uni-app x 项目。适合刚接触 uni-app x、之前只做过传统 uni-app 或 web 开发、想快速理解工程结构的朋友。如果你已经跑通过一个官方模板,可以跳过前半部分,重点看配置和调试那几节,里面有些坑是官方文档不会提醒你的。

1. 搭建前准备:把工具链和思路理顺

1.1 为什么这次选 HBuilderX 作为主力开发环境

uni-app x 项目目前最顺手的开发方式是直接用官方 IDE 来创建和编译。相比纯命令行手动搭工程,HBuilderX 内置了 uni-app x 的编译链路,新建项目时可以直接选择对应模板,运行、打包、日志输出都在同一个界面里完成,省掉了大量环境拼接的时间。

我见过有人尝试用其他编辑器写 uni-app x,最后又回到官方 IDE,原因很简单:uni-app x 的编译器和许多工具链能力目前深度绑定在官方 IDE 内部。你用其他编辑器写代码没问题,但运行调试、云打包这类环节还是要回到官方 IDE 来操作。索性一开始就把 IDE 作为核心工作台,代码编辑用自己顺手的编辑器也行,但项目创建和运行调试统一走官方 IDE。

这个选择背后还有一个实际考量:uni-app x 各平台的原生渲染能力依赖独立的编译器做转换,这类编译过程对版本非常敏感。官方 IDE 每个版本会同步更新编译器,如果你用第三方脚手架手动拼装,依赖版本很容易漂移,出了问题排查成本特别高。

1.2 环境检查清单与路径规划

动手之前,先把环境检查一遍,省得到后面运行时报一堆莫名其妙的错。

  • 官方 IDE 版本:建议直接用最新正式版。版本差太多会导致部分 uni-app x API 不可用或编译报错。
  • 账号登录:官方 IDE 首次使用会要求登录账号,这一步绕不开,主要为了云打包、插件下载等在线服务。没有账号的话先注册一个。
  • Android 环境:如果你要做安卓真机运行,电脑上需要安装对应手机厂商的 USB 驱动。模拟器推荐用官方推荐的安卓模拟器,不建议用太冷门的模拟器,兼容性问题会让你怀疑人生。
  • iOS 环境:跑 iOS 需要 macOS 系统,以及 Xcode 和 CocoaPods 环境。如果只是写业务逻辑,前期可以先用 Web 端或 Android 端调试,避免一上来就被环境卡住。
  • 基础认知:不用把所有文档都读完再动手,但要理解 uni-app x 的几个基础概念:页面文件后缀是 .uvue,逻辑文件是 .uts,它们本质上不是传统 js,而是带类型系统的强化版脚本语言。

补充一点,我第一次搭环境时犯过一个小错误:直接从旧项目里复制了一份 HBuilderX 配置目录,结果运行项目时编译器版本错乱,报了一堆类型定义找不到的问题。后来把 IDE 恢复默认配置、重新下载对应编译器,问题立刻消失。所以环境出问题时,先想想是不是缓存和配置残留导致的。

2. 初始化项目:从向导到跑通 Hello World

2.1 新建项目的关键选项与模板差异

打开 HBuilderX,点击文件 -> 新建 -> 项目,项目类型里选择 uni-app x 相关的模板。这里有几个容易混淆的点,我展开说一下。

首先是项目类型选择。一定不要选成传统 uni-app 项目,两者虽然界面相似,但底层语法和编译目标完全不同。选错之后你会发现自己写不了 .uvue 文件,或者一堆在传统 uni-app 里能跑的语法在这里全部报错。

其次是模板选择。官方可能提供空白模板、默认模板、以及一些带示例业务的模板。对新手来说,建议从默认模板或空白模板起步。默认模板会生成一个最简单的页面,能够快速跑通全流程,建立信心。示例类模板虽然内容丰富,但代码量较大,结构复杂,新手容易迷失在样式和业务逻辑里,反而不利于理解工程骨架。

项目名称建议用小写字母开头,不要带中文和特殊符号。这不仅是编译规范要求,也是为了避免后续做原生打包时因为包名非法而无法通过。比如一个用于学习的项目,我会命名为 uni-app-x-study 或 similar demo 这类带连字符的英文名。注意连字符在原生包里有时会有限制,最稳妥的方式是纯小写字母加数字,比如 studyapp01。

创建完成后先别急着写业务,第一步是跑通页面。默认模板生成的首页如果能在浏览器或真机上显示出来,说明你的工具链已经通了。很多新手一上来就删掉模板代码,然后一行行手写,结果报错时根本分不清是环境问题还是代码问题。正确顺序是先确认基础环境可用,再逐步替换内容。

2.2 初始目录结构逐文件拆解

初始化完成后,你会看到一套和传统 uni-app 非常相似的目录结构。这里我逐个说明它们的职责,理解清楚后再往里面填代码会顺手很多。

  • App.uvue:应用入口级文件,负责应用生命周期和全局样式。相当于整个应用的壳。
  • main.uts:应用的初始化逻辑,比如创建应用实例、挂载全局配置。
  • pages.json:全局页面配置,包含页面路由、窗口样式、导航栏、tabBar 等。几乎所有和页面外观相关的全局配置都在这里。
  • manifest.json:应用配置,包括应用名称、唯一标识、图标、权限声明、打包相关配置。
  • static 目录:存放静态资源,比如图片。注意 uni-app x 对静态资源的引用方式有一些限制,资源路径写错经常导致图片不显示。
  • uni.scss:全局样式变量文件,可以定义一些颜色、字号变量,在组件中直接引用。

第一次看这个目录时,我最大的困惑是 App.uvue、main.uts 和 pages.json 三者的边界。后来用一个类比就理解了:pages.json 是目录册,App.uvue 是整栋楼的外墙和公共设施,main.uts 是大楼门口的安保系统,真正住人的房间是 pages 目录下的一个个 .uvue 页面文件。

这里要特别提醒一点,pages 目录下每个页面都必须被 pages.json 注册,否则运行时会直接报错“页面不存在”。我在初学阶段就遇到过这种情况:新建了一个页面文件,忘了在 pages.json 里加路由,结果跳转一直白屏,排查了半天才发现是注册问题。

3. 项目配置与工程化细节

3.1 pages.json:路由、窗口与导航栏的总控

pages.json 是 uni-app x 项目里最重要的配置文件。它控制哪些页面可以访问、页面之间的路径关系、页面顶部导航栏长什么样、是否可以滚动反弹、下拉刷新是否开启,等等。

pages 数组里的第一项就是应用启动后的首页。这个顺序非常关键,如果首页路径写错,应用一打开就会黑屏或闪退。我习惯把首页放在第一位,其他页面按业务模块分组排列,并在注释里标注页面功能,方便后续维护。

窗口样式方面,navigationBar 可以设置导航栏标题、背景色、字体颜色。globalStyle 负责全局默认样式,但单个页面里的 style 可以覆盖全局配置。这个覆盖关系要记清楚,因为实际开发中常常出现“我在全局设置了导航栏背景色,某个页面却不起作用”的情况,十有八九是那个页面自己又写了 navigationStyle。

还有一项是 tabBar。如果你的应用涉及底部多 Tab 切换,需要在 tabBar 里配置页面路径和图标。这里有个经常被忽略的细节:tabBar 页面跳转要用 uni.switchTab,而不是 uni.navigateTo。如果你用错了 API,页面跳不过去,控制台还会提示你方法使用错误。这个问题我印象很深,因为在网上搜不到太多相关讨论,完全是自己试出来的。

3.2 manifest.json:应用身份、图标与权限声明

manifest.json 是打包和运行时的“身份证”。它包含应用名称、应用唯一标识、版本号、图标、权限列表、隐私政策等。

唯一标识这个字段尤其重要。云打包时系统会用它来区分应用身份,换了一个标识相当于换了一个应用。同一个应用在不同平台的标识策略还不一样,安卓端还涉及包名(applicationId),一旦上线后最好不要修改,否则升级会出问题。

图标这块,很多人会忽略尺寸要求。直接拿一张普通尺寸的图片填进去,打包后会出现图标模糊、被拉伸的情况。规范做法是准备多尺寸图标,至少包含 48x48、72x72、96x96、128x128 等常见规格。初期可以用官方工具一键生成,但要注意生成工具默认的图标样式比较单一,上线项目还是建议设计师单独出图。

权限声明需要根据业务按需添加。比如你要访问相册,就需要在 manifest.json 里声明相册读取权限;要用到手机地理位置,就声明定位权限。声明了权限但没用没关系,最多是审核时被问到;但用了权限却没声明,运行时会直接被系统拦截,甚至崩溃。这里的原则是“宁少勿多”,非必要权限不要加,因为很多应用市场对权限申明有严格审核,权限越多越容易被要求说明用途。

3.3 样式体系与 UTS 类型约束

uni-app x 的样式体系支持 CSS 的主要特性,但在单位体系上有自己的一套约定。rpx 是官方推荐的响应式单位,它会根据屏幕宽度自动换算,在不同尺寸屏幕上保持视觉比例一致。

rpx 的换算规则是:屏幕宽度固定为 750rpx,也就是说 750rpx 就是屏幕的实际宽度。你在设计稿里量到 100px 宽度,如果设计稿是 750 宽的标准,直接写 100rpx 就对了。这个换算逻辑对开发效率提升很大,不用像原生开发那样在各个分辨率之间反复计算。

样式问题上我踩过最费时间的坑是条件编译样式。uni-app x 支持使用条件编译来区分平台,比如针对 App 和 Web 写不同的样式。这个功能很强大,但有一个前提:条件编译注释的位置必须严格放在样式规则外面。我曾在某个选择器内部插入条件编译注释,结果编译后样式直接丢失,排查了将近一个小时才发现是注释位置的问题。

UTS 类型系统是 uni-app x 与传统 uni-app 最大的差异点。传统 uni-app 写 JavaScript,类型错误要等到运行时才暴露;uni-app x 在编译阶段就能捕获很多低级错误。比如你声明了一个变量是 string 类型,后面给它赋值为数字,编译器会直接报错,而不会等到页面运行起来才显示异常,这对团队协作和代码维护成本来说是很大的改进。

刚开始写 UTS 会有一点不习惯,尤其是函数的参数类型、返回类型都要显式标注。比如写一个获取列表的函数:

function fetchList(page: number, size: number): Array<Item> { // 请求逻辑 }

这种写法在前期会觉得啰嗦,但项目规模变大后优势非常明显,重构时不用担心悄悄改坏某个变量的类型。

4. 运行调试:从内置浏览器到真机预览

4.1 Web 端快速预览与内置浏览器

uni-app x 项目在编译阶段,可以编译为 Web 端的代码,所以在没有真机的情况下也能快速预览。HBuilderX 里内置了浏览器预览入口,点一下运行到浏览器,就能看到页面效果。

Web 端调试的优势是速度快,改完代码热更新,页面几乎即时刷新,特别适合开发初期验证布局和样式。但这里有个心态准备:Web 端跑得通,不代表 App 端一定没问题。因为 uni-app x 在 App 端采用原生渲染,部分 CSS 属性和组件行为与浏览器存在差异。我遇到过 border-radius 在 Web 端表现正常、安卓真机上圆角消失的情况,最终原因是某个样式属性需要额外前缀,Web 端自动兼容了,原生端没有。

所以我的建议是:Web 端用来快速验证逻辑和数据流,真机作为最终效果的验收标准。千万不要因为 Web 端没问题就跳过真机测试,否则打包上线后才暴露问题,修复成本会高很多。

4.2 真机同步与自定义基座

真机调试是 uni-app x 开发里绕不开的环节。安卓真机的连接步骤大概是:手机开启开发者选项和 USB 调试,用数据线连接电脑,然后在 HBuilderX 里选择运行到安卓真机。

这一步看起来简单,实际坑最多。最常见的情况是手机已经连接,但真机列表里始终不显示设备。我排查过几次,原因基本集中在三类:USB 驱动没装好、手机没有授权电脑的调试请求、数据线只能充电不能传输数据。建议买一根质量好的数据线,很多偶发性的断连问题其实都是线材问题。

真机运行还有一种模式叫自定义基座。默认基座是官方提供的通用调试容器,功能有限;自定义基座则是把你的原生插件、模块配置打包进一个调试容器里,运行环境更接近最终发布版本。当你用到一些原生能力或第三方插件时,普通运行模式会提示缺少模块,这时就需要先打一个自定义基座。

第一次打自定义基座时我被“运行到手机”和“打包自定义基座”两个按钮搞晕过。前者是直接用默认基座跑,后者是先构建一个自定义运行环境。正确流程是:修改 manifest 里的模块配置,保存后点击打自定义基座,打包成功后,再点击运行到手机,这时候就会用刚生成的自定义基座做调试。顺序反了就会出现“改了半天配置,真机上没有任何变化”的情况。

4.3 调试日志与常见运行瓶颈

真机运行时的日志输出是排查问题的核心工具。推荐用官方 IDE 自带的控制台查看,它会同时输出编译日志和运行日志,而且会把 uni-app x 的报错信息格式化,比自己写 console.log 来得清晰。

调试技巧上有一个习惯值得养成:在任何可能出错的逻辑分支里都加关键日志,尤其是异步请求回调、页面参数解析、接口返回数据校验这几个位置。因为 uni-app x 的编译产物不是简单的浏览器代码,错误堆栈信息有时不够直观,多了关键日志能大幅缩短定位时间。

运行瓶颈方面最需要注意的是冷启动时间。真机调试时,页面加载明显比发布包慢,这是正常现象。如果发布包也慢,检查点主要在:首页是否加载过重的资源、是否有同步的耗时操作阻塞渲染、页面层级是否过深。另外一个常见问题是控制台疯狂打印日志导致性能下降,我在联调阶段见过有人每帧都打印日志,页面直接卡成幻灯片。记住,日志只是临时工具,调试完随手清掉。

5. 写第一个有交互的页面:商品列表 demo

5.1 .uvue 文件结构拆解

光看配置容易困,直接写一个带交互的页面能提速理解。下面我用一个简单的商品列表页做例子,把 .uvue 的核心结构拆开讲。

一个完整的 .uvue 文件包含三块:template 负责页面结构,script 负责逻辑,style 负责样式。看起来和 Vue 单文件组件很像,但有两点明显不同:script 里是基于 UTS 的强类型语法,逻辑代码不能写成松散的自由 JavaScript;页面事件绑定的写法也有严格约定,例如事件类型需要在模板中通过编译校验。

下面是一个可运行的最小页面骨架:

<template> <view class="container"> <view class="item" v-for="item in goodsList" :key="item.id" @click="goDetail(item.id)" > <text class="name">{{ item.name }}</text> <text class="price">{{ item.price }} 元</text> </view> </view> </template> <script> interface GoodsItem { id: number name: string price: number } export default { data() { return { goodsList: [] as GoodsItem[] } }, onLoad() { this.loadGoods() }, methods: { loadGoods() { this.goodsList = [ { id: 1, name: '键盘', price: 99 }, { id: 2, name: '鼠标', price: 59 } ] }, goDetail(id: number) { uni.navigateTo({ url: '/pages/detail/detail?id=' + id }) } } } </script> <style scoped> .container { padding: 20rpx; } .item { padding: 30rpx; margin-bottom: 20rpx; background-color: #f8f8f8; border-radius: 12rpx; } .name { font-size: 28rpx; color: #333333; } .price { font-size: 24rpx; color: #e64340; } </style>

这段代码展示了几个核心知识点:interface 定义数据类型、data 里用类型断言初始化数组、v-for 列表渲染、@click 绑定事件、uni.navigateTo 页面跳转。把它跑通之后,uni-app x 的基础开发节奏基本上就掌握了一半。

5.2 列表渲染、事件与页面跳转

列表渲染是移动应用最高频的场景,值得单独展开。上面的例子用 v-for 渲染数组,其中 :key 必须绑定一个稳定且唯一的标识。很多新手会用数组下标做 key,这在简单场景下没有问题,但列表一旦涉及删除、排序、数据更新,下标作为 key 会产生渲染错乱,因为系统复用了错误的节点。

事件绑定这里有一个很容易踩的坑:事件处理函数里的参数类型,在 uni-app x 里会被编译期检查。比如 @click="goDetail(item.id)",item.id 是 number 类型,那么 goDetail 的参数就必须定义成 number。如果你定义成 string,编译会直接报错,而不是像 JS 那样悄悄做隐式转换。这种强约束在刚开始会让人不适应,但它能逼你把数据类型理清楚,长期看是件好事。

页面跳转携带参数时,接收页面需要主动解析。比如详情页在 onLoad 生命周期里获取参数:

onLoad(options: Record<string, string | undefined>) { const id = options?.id ?? '0' // 根据 id 加载详情数据 }

这里用到了可选链和空值合并,这两个语法在 UTS 里是支持的。注意 options 的类型边界,不同入口跳转时参数格式可能略有差异,解析前最好做一次容错处理。

5.3 性能与体验层面的几个约定

页面写多了之后,性能问题会慢慢浮出来。长列表场景下,直接用 v-for 渲染几百上千条数据时,滑动体验会有肉眼可见的卡顿。如果数据量确实大,建议采用分页加载模式,每次只渲染当前屏幕需要的那一部分数据,降低渲染压力。另一个做法是把静态内容尽量拆出去,减少单个页面节点的复杂度。

还有一个和体验强相关的约定是页面加载态。列表数据从接口获取通常需要时间,如果等待期间页面空白,体验非常差。规范做法是:进入页面先展示 loading 状态,数据返回后渲染列表,请求失败时展示错误提示和重试按钮。这个逻辑在 demo 阶段容易被忽略,但实际项目中几乎是标配。

我建议每个页面的样式集中在 style 里维护,并且刻意使用 scoped 作用域,避免全局样式污染。特别是在多页面项目里,全局选择器一旦写得不严谨,可能会莫名其妙地把其他页面的布局带偏,排查起来非常消耗时间。

6. 常见问题与踩坑实录

6.1 从报错入手排查问题

这里整理一份拢共常踩的报错清单,每一个都是我在实际项目里见过的真实场景。先说最典型的。

编译报错“找不到模块”:大概率是 import 语句路径写错了。uni-app x 对文件路径大小写敏感,文件名是 GoodsList 就不能写 goodslist。这类问题编译期就会暴露,修复比较简单。

页面白屏但控制台无报错:优先检查 pages.json 里是否注册了该页面,以及注册路径是否和文件路径一致。其次是页面文件的 script 里是否有编译期捕获不到的逻辑错误,比如把某个对象当数组使用。

navigateTo 跳转失效:检查目标页面是否已经存在页面上方的导航栈里。uni-app x 的页面栈机制和 web 不一样,同一页面多次入栈会产生栈溢出或跳转异常。这类问题可以通过 uni.navigateBack 先返回上一层,或者用 uni.redirectTo 代替 navigateTo 做重定向。

权限相关报错:运行时提示“没有权限访问某功能”,先回 manifest.json 检查相应权限声明是否已勾选。如果声明无误,再确认是标准基座还是自定义基座。有些原生权限在标准基座里是不开放的,必须用自定义基座调试。

模拟器连接失败:尝试换官方推荐的模拟器,并在开发者选项里关闭再打开 USB 调试,重启模拟器,大多数情况下都能解决。

我把这些问题整理成一张速查表,方便复制到自己的笔记里:

现象可能原因优先排查方向
编译报找不到模块路径或大小写错误检查 import 路径
页面白屏无报错页面未注册检查 pages.json
跳转失效页面栈状态异常检查 navigateTo 用法
权限不生效基座不匹配打自定义基座
模拟器连不上驱动或模拟器问题切换官方推荐模拟器

6.2 比较容易忽略的配置细节

这一节说的不是硬性报错,但会在项目跑了一段时间后冒出来。

第一个是状态栏适配。在默认导航模式下,页面顶部导航栏由系统接管,内容区域不会顶到状态栏,所以很少出问题。但如果你开启了自定义导航样式,页面内容会延伸到状态栏区域,就需要手动在页面里预留状态栏高度。这一步漏掉的话,页面文字就会被手机状态栏遮挡,初看以为是偶然的样式错乱,其实是系统级适配问题。

第二个是全局变量和页面通信。uni-app x 支持通过 getApp().globalData 来存取全局数据,适合放用户信息、基础配置这类低频变化的数据。但高频更新的数据不建议走全局变量,因为全局变量改动不会主动触发页面更新,可能造成界面显示旧数据。跨页面实时通信更稳妥的做法是使用全局事件机制,让页面主动订阅感兴趣的数据变更。

第三个和打包证书有关。安卓正式打包需要生成签名证书。如果项目早期随便填了一个证书信息,后续要更新应用时才发现签名不一致,就必须用同一个证书重新打包。证书是不能随意更换的,不然用户无法覆盖安装新版本。建议项目第一天就生成一套正式的 keystore 文件,并妥善备份密码和证书文件。

第四个是编译模式的混淆。HBuilderX 里运行和发行是两条不同的编译链。发行模式会开启更多编译优化、代码压缩,所以偶尔会出现“运行没问题,发行后却有异常”的情况。遇到这类问题,第一时间用发行模式重新编译,看是否能复现,再针对性排查。不要在处理问题时只盯着代码逻辑,编译链路差异也是重要的排查方向。

7. 打包发布前必须确认的检查项

7.1 各端打包前检查清单

项目开发完成后,打包发布前的检查决定了你能否顺利通过应用市场审核。整理一份通用检查清单,每条都是被验证过的重要项。

应用信息一致性:manifest.json 里的应用名称、版本号、包名是否和规划一致。名称尽量不要频繁改动,包名更是不能轻易变。另一点,版本号采用多少位数没有强制标准,但每次发布必须递增,不能回退。

图标和启动图是否齐全:缺了启动图的典型表现是应用启动时白屏一段时间,审核人员体验会很差。图标的清晰度、圆角处理也要提前验证,部分应用市场会对图标显示区域做裁剪,产生难看的边框。

权限是否过度:逐一核对申请的权限,把没有用到的权限全部清掉。一方面是为了过审,另一方面也是保护用户隐私,降低合规风险。

签名证书是否妥善保存:生成后立即备份,买一台新电脑后不会被证书文件卡住。最好同时记录证书的有效期,避免应用还在维护期,证书已经过期,无法再签名更新。

隐私政策是否完备:涉及用户信息采集的应用,应用市场普遍要求提供可访问的隐私政策内容,并且要在应用首次启动时通过弹窗或其他方式向用户明示。这一项在正式发布前必须准备好文案和入口。

测试项建议至少覆盖:安装、启动、登录、核心业务流程、支付流程(如有)、退出登录、消息推送、前后台切换、断网恢复。很多应用是在断网场景下崩溃的,这个问题最容易在发布后被用户反馈,因为开发调试时网络通常很好,覆盖不到弱网状态。

7.2 从项目搭建到正式上线的完整路径

最后把这套流程梳理成一条清晰的路径,方便后续做任何新项目时按图索骥。

第一步是规划阶段。明确项目要覆盖哪些平台、用哪些原生能力、是否需要支付功能、目标用户是什么操作系统版本。这个阶段直接决定后续的 manifest 配置和页面设计。

第二步是工程搭建。用官方 IDE 创建项目,跑通默认模板,确认开发环境无问题。然后把公共部分搭好:全局样式变量、通用的请求封装、页面路由基础骨架、全局数据处理方案。demo 阶段写代码可以随意一点,但工程骨架建议从一开始就规范化。

第三步是迭代开发。按照页面维度逐步实现功能,开发过程中保持每天至少一次真机运行,避免只在 Web 端开发太久导致原生适配积压。页面可运行之后,再用自定义基座验证原生模块功能。

第四步是测试与优化。做一轮完整的真机回归,重点检查弱网、低端机、不同系统版本的兼容性。如果发现问题,不要急着改代码,先确认是逻辑问题、渲染问题还是配置问题,再对症处理。

第五步是打包与上架。选择正式打包方式,完成签名配置,生成安装包后先在真机上装一遍确认没问题,再提交到应用市场。提交后关注审核反馈,常见驳回原因包括权限用途不明确、隐私政策缺失、启动页异常等。

这条路径我走过不止一遍,最深的感觉是:uni-app x 工程搭建本身并不复杂,难点全在对编译链路和原生特性的理解上。你只要能理解“页面文件通过编译器转成各端原生能力”这件事,遇到问题时的排查方向就会清晰很多。

最后再分享一个小习惯。我每次新建项目都会在 README 里记录 HBuilderX 的版本号、编译器版本、特殊配置。后续项目升级工具链时,这个记录能帮我快速判断新问题是不是版本升级引起的。开发工具类项目,最怕的就是环境变了但自己不知道,留一份环境日志,能省掉很多冤枉时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询