为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2021-11-12 16:10:28
我目前正在为Bot Land编写一些脚本。Bot Land 是一款实时战略游戏,您无需使用鼠标和键盘来控制您的单位,而是编写代码通过 API 控制您的机器人,然后您的机器人去与其他机器人作战。如果您熟悉 SC2 中的单位,您可以创建类似于眨眼跟踪者、攻城坦克、医疗兵和雷兽的机器人。(对于软件工程师来说,这是一个非常有趣的游戏,但这超出了本问题的范围。)Bot 控制具有三个逐渐增加的复杂性级别:默认 AI、类似Scratch的编程语言和一组简化的称为 BotLandScript 的 JavaScript。尽管 BotLandScript 的内置编辑器是合理的,但您必须将所有代码作为一个文件上传,并在任何地方使用全局顶级函数。当然,如果您的代码开始变长并且不同的机器人共享相同的功能,一段时间后这会变得很痛苦。为了方便为多个机器人编写代码,减少在裸 JS 中编码时出现意外错误的机会,并增加我击败其他玩家的机会,我设置了上述 TypeScript 项目,为我的每个机器人提供一个公共库和代码. 当前目录结构大致如下所示:lib/   bot.land.d.ts  common.tsBlinkStalker/  BlinkStalker.ts  tsconfig.jsonArtillery/  Artillery.ts  tsconfig.jsonSmartMelee/  SmartMelee.ts  tsconfig.jsonlib是机器人之间共享的通用代码,并为(非 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从机器人本身以及包含transpiled代码的所有代码common.js。由于以下几个原因,这种设置并不理想,其中包括:它需要大量重复的样板,难以添加新的机器人,每个机器人都包含大量不必要的代码,并且需要单独构建每个机器人。但是,根据我迄今为止的研究,似乎没有一种简单的方法可以做我想做的事。特别是,使用新tsc -b选项和引用不起作用,因为这需要模块化代码,而 Bot Land 需要单个文件,其中所有函数都定义在顶层。尽可能多地实现以下目标的最佳方法是什么?添加新机器人不需要新的样板(例如tsconfig.json每个机器人不需要)使用import了常用的功能,以避免输出无用的代码,但随后...仍然以 Bot Land 的特定格式将所有功能输出为一个文件生成多个输出文件的单个构建步骤,每个机器人一个奖励:将构建过程与 VS Code 集成。目前有一个相应的样板tasks.json用于构建每个子项目。我模糊地推测,除了 之外tsc,答案可能还涉及 Grunt 之类的东西,但我对此知之甚少,无法确定。
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

您实际上可以使用项目引用。按照以下步骤获得与原始文件相同的结果,所有功能都在一个文件中的顶层。但是,我找不到仅在机器人中导入所需功能的解决方案。也就是说,不使用导入和导出。


在根目录下的 tsconfig.json 中


{

    "files": [],

    "references": [

        { "path": "./lib" }

        { "path": "./AggroMiner" }

        { "path": "./ArtilleryMicro" }

        { "path": "./MissileKite" }

        { "path": "./SmartMelee" }

        { "path": "./ZapKite" }

    ]

}


接下来,在你的 lib 文件夹中,像这样添加一个 tsconfig.json


{

  "compilerOptions": {

    "declaration": true,

    "declarationMap": true,

    "composite": true,

    "rootDir": ".",

    "outFile": "../build/lib.js",

    "target": "es3",

    "removeComments": true,

    "sourceMap": false,

  },

  "files": [

    "data.ts",

    "movement.ts",

    "utils.ts"

  ]

}

我们需要对 data.ts、motion.ts 和 utils.ts 做一些调整,这样 ts 就不会因为编译错误而困扰我们。


数据.ts


/// <reference path="./bot.land.d.ts"/>


(...)

运动.ts



/// <reference path="./data.ts"/>

/// <reference path="./utils.ts"/>

(...)

utils.ts


/// <reference path="./bot.land.d.ts"/>

(...)

接下来,我们在根目录添加 base.json(机器人的 tsconfig.json 将扩展它)。


基文件


{

  "compilerOptions": {

    "declaration": true,

    "composite": true,

    "rootDir": ".",

    "target": "es3",

    "removeComments": true,

    "sourceMap": false,

  }

}

和机器人的 tsconfig.json (根据机器人进行调整)


{

  "extends": "../base",

  "compilerOptions": {

    "outFile": "../build/AggroMiner.js",

  },

  "files": [

    "AggroMiner.ts"

  ],

  "references": [

      { "path": "../lib", "prepend": true } //note the prepend: true

  ]

}

就是这样。现在只需运行


tsc -b


查看完整回答
反对 回复 2021-11-12
?
一只名叫tom的猫

TA贡献1906条经验 获得超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"]

}

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

  1. 将任何 bot 文件夹(即src/AggroMiner)复制到下的新文件夹src

  2. 编辑src/<newBotFolder>/tsconfig.jsonoutFile使用您的机器人的名称进行编辑

  3. 编辑src/tsconfig.json并添加对src/<newBotFolder>

已设置以下npm/yarn脚本:

  • build 构建所有机器人

  • build-cleanbuild在运行之前清除文件夹build

  • format.ts在下的所有文件上运行 Prettiersrc

  • lint 对所有机器人脚本运行 tslint 检查

现在运行您的要求:

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

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

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

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

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

完毕。

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

完毕。

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

npm脚本应该出现在VSC的任务列表(至少他们在我做的),从而使tasks.json不必要的。


查看完整回答
反对 回复 2021-11-12
  • 2 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信