build-templates 到底是什么运作逻辑...

3.8.4

先看看案例:

案例1

目录:

build
 |- wechatgame
 |- wechatgame-SDK
build-templates
 |- wechatgame
    |- test.js
 |- wechatgame-SDK
    |- test2.js

打包出来:

build
 |- wechatgame
    |- test.js
    |- test2.js
 |- wechatgame-SDK
    |- test.js
    |- test2.js
build-templates
 |- wechatgame
    |- test.js
 |- wechatgame-SDK
    |- test2.js

案例2

目录:

build
 |- wechatgame
 |- wechatgame-SDK
build-templates
 |- wechatgame
    |- game.json

其中game.json长这样

{
    "plugins": {
        "MiniGameCommon": {
            "version": "latest",
            "provider": "wxaed5ace05d92b218",
            "contexts": [
                {
                    "type": "isolatedContext"
                }
            ]
        }
    },
    "resizable": true
}

打包出来:

build/wechatgame-SDK/game.json

  • 带有完整的内容
  • 带有子包的内容
  • 也带有build-templates里面的pluginsresizable
{
    "deviceOrientation": "portrait",
    "openDataContext": "openDataContext",
    "networkTimeout": {
        "request": 5000,
        "connectSocket": 5000,
        "uploadFile": 5000,
        "downloadFile": 500000
    },
    "plugins": {
        "MiniGameCommon": {
            "version": "latest",
            "provider": "wxaed5ace05d92b218",
            "contexts": [
                {
                    "type": "isolatedContext"
                }
            ]
        }
    },
    "resizable": true,
    "subpackages": [
        {
            "name": "xxx",
            "root": "subpackages/xxx/"
        }
        // ...
    ]
}

build/wechatgame/game.json

  • 所有的信息都没了
  • 完完全全就是把原来的game.json删了, 然后把build-templates/game.json复制过来
{
    "plugins": {
        "MiniGameCommon": {
            "version": "latest",
            "provider": "wxaed5ace05d92b218",
            "contexts": [
                {
                    "type": "isolatedContext"
                }
            ]
        }
    },
    "resizable": true
}

疑问

  • build-templates 里面的目录叫 wechatgame, 为什么我打包 wechatgame-SDK 也会生效呢?
  • 这个目录名, 它是怎么匹配的? wechatgame 是指 wechatgame平台 呢? 还是指 build/wechatgame 这个输出目录呢?
  • 为什么匹配 wechatgame-SDK 的时候, game.json 是融合json的内容, 但是匹配 wechatgame 的时候, 确是整个文件删除替换呢?

build-templates 目前支持 common/平台/构建任务名称 命名的模板

  • common 命名的模板文件,所有平台都生效;
  • 以平台名称命名的模板,对应平台的构建任务都会生效;
  • 以构建任务名称命名的模板,对应平台与之同名的构建任务会生效;

你这里的效果是 wechatgame 的构建任务只有 wechatgame 的模板生效, SDK 的任务两个模板都会生效,相同文件的,构建任务匹配的优先级更高,剩下的处理规则都一样,代码逻辑如此,不会出现一个融合一个替换的行为。

你说的案例我也有尝试过和我说的规则一样,和你描述的不同,比如没有出现你描述的案例 1 内的 test + test2 文件都出现在 wechatgame 的情况,也不会 game.json 的效果不一致。如果你依然有疑问请提供复现 demo 我们会排查。

了解了…你说的这个我也觉得比较合理的…也推测过…

还有就是md5的时机…有些文件拷贝之后会加上md5…有些又不会…

通常遇到这些问题的时候…都是平台需要打好几个包…本来就各种混乱…
还遇到意外状况非常恼火…当时也没有太多时间去铺开来调试了…
后来我干脆自己写了个类似的功能…自己copy文件算了…

有空看有没有时间再整理一下…