ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

微信小游戏云开发未选择环境?三步修复环境关联问题

微信小游戏云开发未选择环境?三步修复环境关联问题 如果你是从 GitHub 上拉过一个带cloudfunctions目录的微信小游戏项目大概率见过这个画面云开发面板打开云函数列表空荡荡顶部赫然写着“未选择环境”。右键上传部署的菜单全是灰的控制台报错也报得不痛不痒。我第一次碰到时以为开发者工具坏了重装了一遍问题照旧。后来才琢磨明白这里根本不是工具的事而是项目跟云端环境的关联压根没建立起来。不管你是用 Unity 打包转出来的微信小游戏还是手写原生 JS 代码只要工程里挂着一个cloudfunctions目录早晚都要面对“环境选择”这道坎。这篇文章我就按自己实际踩坑的排查顺序把“未选择环境”的成因和完整解决办法说清楚适合所有遇到云开发环境选择问题的小游戏开发者尤其是刚拿到开源项目、对着面板发呆的新手。1. 显示“未选择环境”不是工具坏了是环境关联没建立1.1 问题现场云函数列表空白上传菜单全灰先说说具体现象省得你对不上号。打开微信开发者工具导入小游戏项目点工具栏里的“云开发”按钮面板能正常弹出来但里面云函数列表是空的。面板顶部环境那一栏明晃晃写着“未选择环境”。这时你右键cloudfunctions目录下的任意函数文件夹会发现“上传并部署”是灰色的选都选不了。有人可能想用命令行工具强推结果 CloudBase CLI 那边也报找不到环境。整个状态就是东西都在本地但工具不知道把代码传到哪里。我当时在多个社群里看到大家的第一反应都是“工具坏了”或者“需要重装”实际上这两条路都走不通。我重装工具、清缓存、重新登录折腾了大半天最后发现是项目配置的问题。1.2 环境关联的三方暗号机制要真正理解这个报错得先弄清楚微信开发者工具是怎么认定“云函数归属”的。我的理解是它需要三方对上暗号云端确实存在一个云开发环境带唯一的envId环境ID比如cloud1-3g4h5j项目配置文件里声明了云函数目录的位置也就是cloudfunctionRoot代码里调用wx.cloud.init并且指定了要连接哪个环境这三件事少一件面板就会摆出一张“未选择环境”的脸。最典型的场景是你微信账号下只有一个环境 A但项目代码和配置里写的全是原作者的另一个环境 B。工具编译完代码发现环境 B 在当前账号下根本不存在自然就选不出来于是干脆给你显示“未选择环境”。这里要特别提醒一句网上很多教程只让你在工具面板里点两下却没说为什么点了还是不行。原因就在于面板手动选择环境只是其中一环。如果代码里wx.cloud.init写死了别人的环境ID你在面板选了也没用运行时照样连不上那个不存在的环境。所以别急着认为面板选一下就是全部答案。2. 动手之前先确认你手里有没有环境2.1 控制台查环境和环境ID解决问题的第一步不是改代码而是先确认自己账号下到底有没有可用的云开发环境。打开微信云开发控制台用和开发者工具同一个微信号登录。控制台首页会列出你名下的所有环境。如果列表是空的就点“新建环境”。创建时注意环境ID和环境名称是两个概念环境名称是给人看的比如“测试环境”“生产环境”环境ID才是代码和配置文件里真正要写的那一串格式通常是短横线连接的随机串比如cloud1-7g8k2x。在控制台的环境设置里就能看到环境ID直接复制保存好。这里有个小经验新手经常把环境名称当环境ID填进wx.cloud.init结果怎么调都不通。记住了只要是写给代码和配置文件的一律用环境ID。2.2 开源项目最常见的坑环境是作者的接下来这点很关键。我遇到的“未选择环境”十有八九是因为项目是别人的。从 GitHub 或其他渠道拉下来的开源项目作者在自己电脑上写好了环境ID这个 ID 在他的账号下有效但在你的账号下查无此环境。例如作者的代码里是// game.js wx.cloud.init({ env: cloud1-author-env-id, traceUser: true })这个env指向的环境在你的微信账号里根本不存在。工具自然没法选中于是显示“未选择环境”。你要做的就是把这个环境ID替换成你自己的然后再到工具面板里选自己的环境。这里要特别提醒 Unity 或者 Laya 转小游戏过来的开发者微信小游戏的入口文件是game.js不是app.js。用 Unity 导出的工程入口文件往往藏在编译产物里找入口时不要死盯着app.js不放去看game.json里配置的启动入口是哪个文件云开发的初始化逻辑写在那里。2.3 测试号与正式AppID对云开发的影响还有一个经常被忽略的前置条件AppID 的类型。如果你用的是开发者工具默认的“测试号”那终究走不到云开发这一步。测试号没有云开发权限也不会有真实环境面板自然永远显示“未选择环境”。遇到这种情况先去微信公众平台注册一个小游戏账号拿到正式的小游戏 AppID。个人主体也可以用云开发的基础版有免费额度适合个人项目起步。把正式 AppID 填进project.config.json开发者工具里重新登录云开发面板才会同步到你的真实环境列表。3. 解决“未选择环境”的三层配置从界面到代码3.1 第一层云开发面板手动选环境确认环境存在之后回到微信开发者工具。点工具栏的“云开发”按钮打开云开发面板。面板顶部会有环境选择的下拉框点开选择你刚才确认好的那个环境。如果你的账号只有一个环境工具通常会自动帮你选上有多个环境的手动确认一下当前选的是哪个。做完这一步云函数列表一般就出来了“未选择环境”的提示也就暂时消失了。但先别急着庆祝。面板选对了不代表上传云函数就完全畅通了下面两层配置只要有一层对不上上传时照样会出幺蛾子。3.2 第二层project.config.json 声明云函数目录第二层是项目配置文件。如果你的项目里压根没声明cloudfunctions目录开发者工具不知道去哪找云函数云函数列表就是空的上传更是无从谈起。在微信小游戏项目根目录下找到project.config.json确保有下面这样的配置{ compileType: game, cloudfunctionRoot: cloudfunctions/, appid: wx你的真实AppID, projectname: 你的项目名, setting: { es6: true, urlCheck: false } }cloudfunctionRoot这个字段就是告诉工具云函数目录在哪。路径从项目根目录算起一般默认是cloudfunctions/。如果你的目录叫别的名字比如cloud-functions/、functions/这里的值就得对应改成实际目录名。注意一点新版开发者工具的某些模板里也会出现cloudbaseRoot这个字段作用和cloudfunctionRoot类似。两个字段同时出现时工具到底读哪个不同版本行为有差异。我的建议是保留cloudfunctionRoot兼容性最好如果发现配置了cloudfunctionRoot但工具不识别检查一下是不是工具版本太老升级后一般都能解决。3.3 第三层game.js 里 wx.cloud.init 指定 env第三层也是最容易踩坑的一层代码初始化。无论面板怎么选小游戏运行时只有wx.cloud.init发了话才算数。在入口文件game.js的顶部加上这一段wx.cloud.init({ env: 你的环境ID, traceUser: true })env必须是环境ID不是环境名称。把云开发控制台里复制到的环境ID原样填进去一行代码就能解决大部分“未选择环境”的运行时问题。如果你原来写的是不带env的版本wx.cloud.init({ traceUser: true })在单环境的账号下这样一般也能跑工具会自动选默认环境。但账号下只要有多个环境不带env就可能选到不想用的那个甚至干脆选不出来。表现刚好就是云函数列表空转、提示未选择环境。所以不管什么情况我都建议显式把env写上一劳永逸。顺带说一句云开发环境ID不算敏感信息在开发者工具里本来就是完全可见的不用像对待 API Key 一样把它藏着掖着。真正的权限安全靠的是后续云函数的权限配置和数据库安全规则。4. 多环境切换与 DYNAMIC_CURRENT_ENV 的取舍4.1 为什么会默认选到错误的环境有开发者问过我为什么我账号下明明有环境工具还是显示“未选择环境”或者执意选中我不想要的那个原因是这样的当你账号下有多个云开发环境工具需要决定哪个是当前项目的默认关联环境。如果代码里wx.cloud.init没指定env工具会尝试按内部规则猜比如按环境创建时间选第一个或者沿袭项目配置文件里残留的历史选择记录。如果这些信息对不上当前账号的实际情况就会出现“选不出来”或者“选错人”的尴尬局面。我之前维护一个项目时开发环境叫dev生产环境叫prod面板里默认选中了dev但小程序线上版本连的是prod。结果我在工具里写了个测试云函数右键“上传并部署”时选成了dev线上环境那边一点变化没有我却在本地调试老半天以为代码有 bug。这类问题的根源就是“面板选中环境”和“代码指定环境”没有保持一致。面板只管这单次操作传到哪代码才管线上运行时连到哪。两条线不在一个环境上早晚要翻车。4.2 云函数内部建议用动态当前环境再往前一步云函数运行时的环境匹配也有学问。当你把同一个云函数分别部署到dev和prod两个环境云函数里如果要初始化服务端 SDK最好采用动态匹配的方式// 云函数内 index.js const cloud require(wx-server-sdk) cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })DYNAMIC_CURRENT_ENV的意思是“当前环境”即这个云函数被部署到哪个环境运行时就自动连接哪个环境。这样写的好处是同一个云函数代码不需要在不同环境间改来改去上传到 dev 就跑 dev上传到 prod 就跑 prod行为完全和环境隔离。但要强调一下这解决的是“云函数内部连哪个数据库、调哪个接口”的问题不是工具栏“未选择环境”的解决方案。前面文章里讲的都是工具层面的关联别把这两个问题混为一谈。碰到“未选择环境”按第 3 节的流程走碰到“云函数跑起来但数据不对”再检查是不是没用动态当前环境。4.3 开发/生产环境隔离的配置习惯多环境场景下为了少出幺蛾子我自己养成了一些配置习惯分享给大家参考本地开发时game.js里的wx.cloud.init固定写dev环境的环境ID发布体验版或线上版前把game.js的env切换成prod环境的环境ID云函数内部统一用cloud.DYNAMIC_CURRENT_ENV不做任何硬编码project.config.json里只保留cloudfunctionRoot不掺入环境ID相关的字段这样配置下来工具面板选什么环境只影响你当前手动操作的云函数上传线上到底跑哪个环境完全由game.js和云函数内的DYNAMIC_CURRENT_ENV决定。职责清晰排查起来也很省心。有个进一步的小技巧如果你经常切换环境把两个环境ID写成一个配置文件在云函数里做一次读取const envMap { dev: cloud1-dev-env-id, prod: cloud1-prod-env-id } wx.cloud.init({ env: envMap.develop || envMap.production, traceUser: true })再配合构建时的环境变量替换能减少许多手动改代码的失误。不过这套方案对小项目来说有点重只有团队协作或多环境并行时值得投入。5. 完整排查链路与隐藏坑记录5.1 按顺序排查的完整流程如果你现在正好卡在“未选择环境”别东一榔头西一棒子按下面这个顺序一步步来基本能定位问题第一步确认 AppID 不是测试号。看开发者工具右上角如果是“测试号”先换正式 AppID。这一步错了后面全白搭。第二步确认云端有环境。登录云开发控制台看看账号下有没有环境列表。没有就新建一个记下环境ID。第三步检查project.config.json。确认有compileType: game和cloudfunctionRoot: cloudfunctions/。路径写错或者漏掉字段工具就找不到云函数目录。第四步检查game.js的初始化代码。确认wx.cloud.init里env是你自己的环境ID检查入口文件路径对不对Unity 转出来的项目尤其要核实。第五步在开发者工具面板重选环境。打开云开发面板切换一下环境下拉框让工具重新读一次环境列表。这一步也能处理部分面板缓存异常的情况。第六步验证上传。右键cloudfunctions下的具体函数目录选择“上传并部署云端安装依赖”。如果能看到上传进度说明环境关联已经打通。5.2 我踩过的几个隐藏坑最后聊几个容易被忽略的坑每个都是我拿时间换来的教训。坑一只改了game.js的 env没改project.config.json。有一次我把game.js里的环境ID换成了新环境面板还是显示“未选择环境”。排查半天发现是project.config.json里的cloudfunctionRoot路径写错了工具根本没识别到云函数目录。代码层面改得再好工具找不到目录也白搭。坑二删掉云函数目录里的 node_modules 倒不会导致“未选择环境”但会导致“上传后无法运行”。很多人磁盘空间紧张喜欢把云函数本地安装的依赖删掉觉得“反正云端安装依赖”。但如果你右键选择的是“上传并部署不上传依赖”云端就没有wx-server-sdk函数一调用就报模块不存在。这个坑和本文主题不是同一个但很容易连着踩。坑三开发者工具版本太老读不到新配置。我有一段时间用旧版本工具配置了cloudfunctionRoot但面板死活不认。升级到最新版后问题自动消失。遇到环境相关的问题时先看一眼工具版本号新版对云开发的支持完善很多。坑四把环境名称当环境ID。这个前面提到过但值得再说一遍。环境名称是我的开发环境这种人类友好的名字环境ID是cloud1-xyz123这种。填错时不会立刻报“未选择环境”但运行时会提示环境不存在或者干脆拿不到数据。坑五环境关联成功后换电脑又要重来一次。云开发的环境关系是跟着账号和项目配置走的换台电脑登录同一个微信号重新导入项目game.js里已经写好的 env 会生效但面板还是要手动选一次环境。这不是 bug是工具的正常机制提前知道就不慌。按这套链路排查下来绝大多数“未选择环境”都能解决。微信小游戏云开发这块环境设置属于最基础也最磨人的环节把环境ID、云函数目录、初始化代码这三者理清楚后面做数据存储、调用云函数就顺滑多了。前几天我帮一个用 Unity 做小游戏的朋友处理同样的问题他看了一遍上面的排查步骤十分钟就搞定跟我说早知道这么简单就不该把工具卸载重装了。
返回列表