配置具有公共依赖项的TypeScript项目以构建多个纯JavaScript输出文件

And*_*Mao 10 javascript typescript tsconfig visual-studio-code

我目前正在为Bot Land编写一些脚本。Bot Land是一款实时策略游戏,您无需编写代码即可通过API控制机器人,而无需使用鼠标和键盘来控制自己的单位,然后您的机器人就可以与其他机器人进行对抗。如果您熟悉SC2中的单元,则可以创建类似于眨眼潜行者,攻城坦克,医护人员和超能力的机器人。(对于软件工程师来说,这是一个非常有趣的游戏,但这超出了此问题的范围。)

机器人土地

Bot控件具有三个级别,这些级别的复杂性不断提高:默认的AI,类似于Scratch的编程语言以及减少了的称为BotLandScript的JavaScript集。尽管BotLandScript的内置编辑器是合理的,但是您必须将所有代码作为一个文件上载,并在各处使用全局顶级功能。自然,如果您的代码开始变长并且不同的机器人共享相同的功能,那么一段时间后,这将变得很痛苦。

编程环境

为了方便为多个机器人编写代码,减少使用裸露的JS编码时发生意外错误的机会,并增加击败其他玩家的机会,我设置了上述TypeScript项目,以提供一个公共库以及每个机器人的代码。当前目录结构大致类似于以下内容:

lib/ 
  bot.land.d.ts
  common.ts
BlinkStalker/
  BlinkStalker.ts
  tsconfig.json
Artillery/
  Artillery.ts
  tsconfig.json
SmartMelee/
  SmartMelee.ts
  tsconfig.json
Run Code Online (Sandbox Code Playgroud)

lib是bot之间共享的通用代码,并为(非TS)Bot Land API提供TypeScript定义。然后,每个机器人都有自己的文件夹,其中一个文件包含机器人代码,另一个文件包含样板tsconfig.json

lib/ 
  bot.land.d.ts
  common.ts
BlinkStalker/
  BlinkStalker.ts
  tsconfig.json
Artillery/
  Artillery.ts
  tsconfig.json
SmartMelee/
  SmartMelee.ts
  tsconfig.json
Run Code Online (Sandbox Code Playgroud)

tsconfig.json构建每一个组件时,它都会创建一个对应的对象bot.js,其中包含来自bot本身的转译代码以及中的所有代码common.js。此设置由于以下几个原因而欠佳:需要大量重复的样板,使其很难添加新的bot,每个bot都包含很多不必要的代码,并且需要分别构建每个bot。

但是,根据我到目前为止的研究,似乎没有一种简单的方法可以完成我想要的事情。特别是,使用new tsc -b选项和引用不起作用,因为这需要对代码进行模块化,而Bot Land需要一个文件,且所有功能都在顶层定义。

达成以下尽可能多的最佳方法是什么?

  • 不需要新的样板即可添加新的机器人(例如,tsconfig.json每个机器人不需要)
  • 使用import了常用的功能,以避免输出无用的代码,但随后...
  • 仍以Bot Land的特定格式将所有功能输出为一个文件
  • 一个生成多个输出文件的构建步骤,每个机器人一个
  • 奖励:将构建过程与VS Code集成在一起。当前有一个tasks.json用于构建每个子项目的样板。

我含糊地猜测答案可能除了之外还涉及Grunt之类的东西tsc,但是我对此一无所知。

Pop*_*Wza 3

这是我尝试回答您的要求。

值得注意的文件:

  • src/tsconfig-botland.json保存任何bot.land脚本的设置(包括我移至的自定义声明types/bot-land/index.d.ts)。您可以更改strict我使用的设置。
  • src/tsconfig.json保存对所有机器人的引用。这是当您想要添加另一个机器人脚本时要编辑的文件

机器人脚本至少由两个文件组成:一个极简脚本文件tsconfig.json和一个或多个.ts脚本文件。

例如src/AggroMiner/tsconfig.json

{
    "extends": "../tsconfig-botland",
    "compilerOptions": {
        "outFile": "../../build/AggroMiner.js"
    },
    "files": ["index.ts"],
    "include": ["**/*.ts", "../lib/**/*.ts"]
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,要启动新的机器人脚本,您应该:

  1. 将任何 bot 文件夹(即src/AggroMiner)复制到下一个新文件夹src
  2. 编辑以使用您的机器人名称src/<newBotFolder>/tsconfig.json编辑outFile
  3. 编辑src/tsconfig.json并添加引用src/<newBotFolder>

以下npm/yarn脚本已设置:

  • build构建所有机器人
  • build-cleanbuild在运行之前清除文件夹build
  • format.ts下面的所有文件运行 Prettiersrc
  • lint对所有机器人脚本运行 tslint 检查

现在列出您的要求:

  • 添加新机器人不需要新的样板(例如每个机器人不需要 tsconfig.json)

要实现这一点,需要创建一些脚本来枚举您的机器人文件夹/脚本...并设置每个机器人的相关内容tsconfig.json并运行tsc。除非绝对必要,否则最小设置(如上所述)可能就足够了。

  • 对常用函数使用 import 以避免输出未使用的代码,但是……

首先,请注意,如果您开始使用任何模块export/import语句,您将需要额外的第 3 方来打包/treeshake 以实现单个文件输出。据我从 Bot.land 收集到的信息,您的脚本正在服务器上运行。除非死代码对您的机器人性能产生影响,否则我不会真正打扰。

  • 仍然以 Bot Land 的特定格式将所有函数输出为一个文件

完毕。

  • 单个构建步骤可生成多个输出文件,每个机器人一个

完毕。

  • 奖励:将构建过程与 VS Code 集成。目前有一个相应的样板文件tasks.json用于构建每个子项目。

这些npm脚本应该出现在 vsc 的任务列表中(至少在我的任务列表中是这样),这样就tasks.json没有必要了。