Настройте проект TypeScript с общими зависимостями для создания нескольких простых выходных файлов JavaScript - PullRequest
10 голосов
/ 08 октября 2019

Я сейчас пишу некоторые сценарии для Bot Land . Bot Land - это стратегия в реальном времени, в которой вместо управления своими юнитами с помощью мыши и клавиатуры вы пишете код для управления своими ботами через API, а затем ваши боты начинают сражаться с ботами других. Если вы знакомы с юнитами в SC2, вы можете создавать ботов, похожих на мигающих сталкеров, осадных танков, медиков и ультралисков. (Это довольно забавная игра для разработчиков программного обеспечения, но это выходит за рамки этого вопроса.)

bot land

Управление ботом имеет три уровня возрастающей сложности:AI по умолчанию, Scratch -подобный язык программирования и сокращенный набор JavaScript, называемый BotLandScript. Хотя встроенный редактор для BotLandScript является разумным, вы должны загрузить весь свой код в виде один файл с глобальными функциями верхнего уровня повсюду. Естественно, через некоторое время это начинает становиться болезненным, если ваш код начинает становиться длинным и разные боты совместно используют одни и те же функции.

programming environment

Для облегчения написания кода длянесколько ботов, чтобы уменьшить вероятность непреднамеренных ошибок при кодировании на голом JS и увеличить мои шансы побить других игроков, я настроил над проектом TypeScript , чтобы предоставить общую библиотеку, а также код для каждого из моихботов. Текущая структура каталогов выглядит примерно так:

lib/ 
  bot.land.d.ts
  common.ts
BlinkStalker/
  BlinkStalker.ts
  tsconfig.json
Artillery/
  Artillery.ts
  tsconfig.json
SmartMelee/
  SmartMelee.ts
  tsconfig.json

lib - это общий код, который используется совместно ботами, и предоставляет определения TypeScript для API-интерфейса Bot Land (не TS). Затем каждый бот получает свою собственную папку, в которой один файл содержит код бота, а другой - шаблон tsconfig.json:

{
  "compilerOptions": {
    "target": "es3",
    "module": "none",
    "sourceMap": false,
    "outFile": "bot.js"
  },
  "files": [
    "MissileKite.ts"
  ],
  "include": [
    "../lib/**/*"
  ]
}

Когда каждый tsconfig.json собран, он создает соответствующий bot.js, содержащийпередал код от самого бота, а также все код в common.js. Эта настройка является неоптимальной по нескольким причинам, среди прочего: она требует большого количества дубликатов, затрудняет добавление новых ботов, включает в себя много ненужного кода для каждого бота и требует, чтобы каждый бот создавался отдельно.

Однако, основываясь на моих исследованиях , не кажется, что есть простой способ сделать то, что я хочу. В частности, использование новой опции tsc -b и ссылок не работает, потому что для этого требуется, чтобы код был модульным, а Bot Land требуется один файл со всеми функциями, определенными на верхнем уровне.

Как лучше всегодля достижения максимально возможного числа следующих действий?

  • Не требуется новый шаблон для добавления нового бота (например, нет tsconfig.json на бот)
  • Используйте import для общих функцийчтобы избежать вывода неиспользуемого кода, но затем ...
  • По-прежнему выводить все функции в виде одного файла в специальном формате Bot Land
  • Один шаг сборки, который создает несколько выходных файлов, по одному для каждого бота.
  • Бонус: интеграция процесса сборки с VS Code. В настоящее время существует соответствующий шаблон tasks.json для создания каждого подпроекта.

Я смутно догадываюсь, что ответ, вероятно, включает что-то вроде Grunt в дополнение к tsc, но яне знаю достаточно об этом, чтобы быть уверенным.

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

репо (повторное копирование)

Вы можете использовать ссылки на проекты. Выполните следующие действия, чтобы получить те же результаты, что и для исходных файлов, со всеми функциями верхнего уровня в одном файле. Тем не менее, я не мог найти решение для импорта только необходимых функций в ботах. То есть без использования импорта и экспорта.

В вашем 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 не беспокоил нас ошибками компиляции.

data.ts

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

(...)

motion.ts


/// <reference path="./data.ts"/>
/// <reference path="./utils.ts"/>
(...)

utils.ts

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

Далее мы добавляем base.json в корень (tsconfig.json ботов расширит его).

base.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
2 голосов
/ 15 октября 2019

Вот моя попытка ответить на ваши требования.

Известные файлы:

  • src/tsconfig-botland.json содержит настройки для любого bot.land *Скрипт 1010 * (включая ваши пользовательские объявления, которые я переместил на 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. скопировать любую папку бота (то есть src/AggroMiner)в новую папку в src
  2. отредактируйте src/<newBotFolder>/tsconfig.json, отредактируйте outFile с именем вашего бота
  3. , отредактируйте src/tsconfig.json и добавьте ссылку на src/<newBotFolder>

Установлен следующий скрипт npm / yarn:

  • build для сборки всех ботов
  • build-clean, которые очищаютПапка build перед запуском build
  • format для запуска Prettier на всех .ts файлах в src
  • lint для запуска проверки tslint на всех скриптах ботов

Теперь выполняем ваши требования:

  • Не требуется новый шаблон для добавления нового бота (например, нет tsconfig.json на бот)

Для достижения этого потребуетсяя создаю какой-нибудь скрипт, который перечислит вашу папку / скрипты ботов ... и настроит соответствующую для бота tsconfig.json и запустит tsc. Если это не является строго необходимым, минимальной настройки (описанной выше) может быть достаточно.

  • Используйте импорт для общих функций, чтобы избежать вывода неиспользуемого кода, но затем ...

Во-первых, имейте в виду, что если вы начнете использовать какие-либо операторы export / import, вам понадобится дополнительная сторонняя программа для упаковки / treehake, чтобы добиться вывода одного файла. Из того, что я мог собрать из Bot.land, ваши скрипты работают на сервере. Если бы не мертвый код не влиял на производительность вашего бота, я бы не стал беспокоиться.

  • Тем не менее выводить все функции в виде одного файла в специфическом формате Bot Land

Готово.

  • Один шаг сборки, который создает несколько выходных файлов, по одному для каждого бота

Готово.

  • Бонус: интеграция процесса сборки с VSКод. В настоящее время существует соответственно шаблонный файл tasks.json для создания каждого подпроекта.

Сценарии npm должны появиться в списке задач vsc (по крайней мере, в моем), таким образом, tasks.jsonнет необходимости.

...