【发布时间】:2020-02-05 06:57:04
【问题描述】:
我目前正在为Bot Land 写some scripts。 Bot Land 是一款实时战略游戏,您无需使用鼠标和键盘控制您的单位,而是编写代码通过 API 控制您的机器人,然后您的机器人与其他机器人战斗。如果您熟悉 SC2 中的单位,您可以创建类似于眨眼追踪者、攻城坦克、医务人员和超级巨蜥的机器人。 (对于软件工程师来说,这是一款非常有趣的游戏,但这超出了这个问题的范围。)
Bot 控件具有三个不断增加的复杂性级别:默认 AI、类似Scratch 的编程语言和一组简化的 JavaScript,称为 BotLandScript。虽然 BotLandScript 的内置编辑器是合理的,但您必须将所有代码作为 一个文件 上传,并在任何地方使用全局顶级函数。当然,如果您的代码开始变得很长并且不同的机器人共享相同的功能,这会在一段时间后开始变得痛苦。
为了方便为多个机器人编写代码,减少在裸 JS 编码时出现意外错误的机会,并增加我击败其他玩家的机会,我设置了 above TypeScript project 为每个机器人提供公共库和代码我的机器人。当前目录结构大致如下:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib 是机器人之间共享的公共代码,并为(非 TS)Bot Land API 提供 TypeScript 定义。然后每个机器人都有自己的文件夹,其中一个文件包含机器人代码,另一个文件包含样板文件tsconfig.json:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
当每个tsconfig.json 被构建时,它会创建一个对应的bot.js,其中包含来自机器人本身的转译代码以及所有common.js 中的代码。由于以下几个原因,这种设置不是最理想的:它需要大量重复的样板,难以添加新的机器人,每个机器人都包含大量不必要的代码,并且需要单独构建每个机器人。
但是,基于my research so far,似乎没有一种简单的方法可以做我想做的事。特别是,使用新的 tsc -b 选项和引用不起作用,因为这需要将代码模块化,而 Bot Land 需要一个文件,其中所有函数都在顶层定义。
尽可能多地实现以下目标的最佳方法是什么?
- 添加新机器人不需要新样板(例如,每个机器人不需要
tsconfig.json) - 对常用函数使用
import,以避免输出未使用的代码,但随后... - 仍然以 Bot Land 的特定格式将所有函数输出为一个文件
- 生成多个输出文件的单个构建步骤,每个机器人一个
- 奖励:将构建过程与 VS Code 集成。目前有一个对应的样板文件
tasks.json用于构建每个子项目。
我隐约猜测答案可能涉及到像 Grunt 和 tsc 这样的东西,但我对此知之甚少,无法确定。
【问题讨论】:
-
所有机器人都必须有单独的文件夹吗?还是每个机器人都位于单个文件的根级别就足够了? (例如
<root>/MissileKite.ts) -
所有转译的机器人文件是否必须命名为
bot.js? -
根在单个文件中会更好;由于单独的
tsconfig.json,它们位于单独的文件夹中。转译的机器人文件可以命名为任何名称,最好是原始文件的 .js 版本。我现在在输出到build/MissileKite.js的 repo 中设置了这种方式。 -
@andrew-mao 你可以看看我的 GAS 项目模板,它可以满足你的大部分需求(但针对不同的环境)如果它适合你,我可能会为你调整它下周某个时候。 github.com/PopGoesTheWza/ts-gas-project-starter
-
tsconfig-gas.json是相关的东西吗?
标签: javascript typescript visual-studio-code tsconfig